我是C#的新手,所以我真的不知道如何制作它,但在C ++中我是这样做的
template <typename T> writeInt(int location, T value){
*(T*)&buffer[location] = value;
}
在C#中我试图做同样的事情
public void WriteInt<T>(int location,T value)
{
(T)buffer[location] = value;
}
但是我发现了这个错误Cannot convert type 'byte' to 'T'
我怎么能这样做,谢谢
答案 0 :(得分:5)
首先,
您应该使用MemoryStream
和BinaryWriter
将原始类型写入缓冲区。您可以按照建议使用BitConverter
类,但最终会有很多中间byte[]
对象。
byte[] buffer;
int value1 = 10;
double value2 = 20;
string value3 = "foo";
using(var ms = new System.IO.MemoryStream())
{
using(var writer = new System.IO.BinaryWriter(ms))
{
writer.Write(value1);
writer.Write(value2);
writer.Write(value3);
}
}
buffer = ms.ToArray();
(value1
,value2
和value3
只是示例,向您展示了几种可用的重载;您应该查看the MSDN page on BinaryWriter以获取更多信息)
更重要的是,
您在C ++代码中使用指针运算; C#仅在unsafe
块中运行时提供真正的指针功能,如果可能的话(在此处),应该避免使用它。 .NET适用于引用,而不是指针,因此您无法控制实际的内存分配。
长话短说,你不能按照你想要的方式做你想做的事。
答案 1 :(得分:2)
为了做你想做的事,我相信你需要做这样的事情:
byte[] buffer = new byte[8192] ;
void WriteInt<T>( int offset , T value)
{
Type tBitConvert = typeof(BitConverter) ;
MethodInfo getBytes = tBitConvert.GetMethod( "GetBytes" ,
BindingFlags.Static|BindingFlags.Public ,
Type.DefaultBinder , new Type[]{ typeof(T) } ,
null
) ;
if ( getBytes == null ) throw new InvalidOperationException("invalid type") ;
byte[] octets = (byte[]) getBytes.Invoke(null, new object[]{ value } ) ;
Array.Copy( octets , 0 , buffer , offset , octets.Length ) ;
return ;
}
但我认为你会变得更好 - 当然更加惯用 - 如果你只是使用System.IO.BinaryStream
,将其分类以提供你想要的缓冲。
答案 2 :(得分:0)
所以我可以说WriteInt或32 etc,buffer = byte []
在任何一种情况下都不允许你拥有。
如果缓冲区是字节数组,则需要将值转换为字节数组。