您可能已经知道,我正在迁移到 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 数组”

这是它的放置方式

  1. packetbuffer[0] 将为 0xC
  2. packetbuffer[1] 将为 0x00
  3. packetbuffer[2] 将为 0x50
  4. 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 方法应该可以完成转换为字节数组的技巧)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top