正如您可能已经知道的那样,我正在迁移到C#中,并且C ++中的某些内容看起来不同。
C ++代码
BYTE packetBuffer[32] = {0};
*(LPWORD)(packetBuffer + 0) = 0xC;
*(LPWORD)(packetBuffer + 2) = 0x5000;
*(LPDWORD)(packetBuffer + 6) = dwArgs[13];
*(LPDWORD)(packetBuffer + 10) = *(keyArray2 + 0);
*(LPDWORD)(packetBuffer + 14) = *(keyArray2 + 1);
注意dwArgs和keyArray2是“DWORD数组”
这就是它的放置方式
等等
如何在C#中做到这一点?
我尝试了这个,但它不起作用
packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
答案 0 :(得分:2)
您可以使用BitConverter
将数据转换为字节数组或从字节数组转换数据。遗憾的是,没有工具可以复制到现有阵列中。如果您需要,我MiscUtil library中的EndianBitConverter
允许此项,并允许您指定要使用的字节序。 (BitConverter
在.NET中通常是小端 - 您可以使用IsLittleEndian
字段进行检查。)
例如:
EndianBitConverter converter = EndianBitConverter.Little;
converter.CopyBytes((short) 0xc, packetBuffer, 0);
converter.CopyBytes((int) 0x5000, packetBuffer, 2);
converter.CopyBytes(dwArgs[13], packetBuffer, 6);
等。第二次调用int
时对CopyBytes
的强制转换是多余的,但为了清晰起见(包括上一行!)。
编辑:如果您更愿意使用.NET标准库,另一种选择,您可能希望将BinaryWriter
与MemoryStream
一起使用。
答案 1 :(得分:0)
你做不到。 C#是强类型的。变量只有一种,只有一种。不允许像C ++ reinterpret_cast这样的诡计。
但是有几种方法可以解决您的问题。第一个也是显而易见的是使用内置的序列化框架。除非必须,否则不要费心编写自己的序列化代码。在.NET中,您不必经常这样做。
第二种是使用BitConverter类(GetBytes方法应该转换为字节数组)