题
您可能已经知道,我正在迁移到 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 数组”
这是它的放置方式
- packetbuffer[0] 将为 0xC
- packetbuffer[1] 将为 0x00
- packetbuffer[2] 将为 0x50
- packetbuffer[3] 将为 0x00
等等
在 C# 中如何做到这一点?
我尝试过这个,但它不起作用
packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
解决方案
您可以使用 BitConverter
将数据与字节数组相互转换。不幸的是,没有工具可以复制到现有的数组中。我自己的 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);
ETC。演员阵容 int
在第二次通话中 CopyBytes
是多余的,但为了清楚起见而包含在内(请记住前一行!)。
编辑:如果您宁愿坚持使用 .NET 标准库,您可能需要使用另一种选择 BinaryWriter
与一个 MemoryStream
.
其他提示
你不能。C# 是强类型的。变量只有一种类型。不允许像 C++ reinterpret_cast 这样的诡计。
不过,有几种方法可以解决您的问题。第一个也是显而易见的就是使用内置的序列化框架。除非必要,否则不要编写自己的序列化代码。而在 .NET 中,您通常不必这样做。
第二种是使用 BitConverter 类(GetBytes 方法应该可以完成转换为字节数组的技巧)
不隶属于 StackOverflow