0

您可能已经知道,我正在迁移到 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. 数据包缓冲区 [0] 将为 0xC
  2. 数据包缓冲区 [1] 将为 0x00
  3. 数据包缓冲区 [2] 将为 0x50
  4. 数据包缓冲区 [3] 将为 0x00

等等

如何在 C# 中做到这一点?

我试过这个,但它不起作用

packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
4

2 回答 2

2

您可以使用BitConverter将数据与字节数组相互转换。不幸的是,没有工具可以复制到现有数组中。如果您需要,我EndianBitConverter在我的MiscUtil 库中自己的库允许这样做,当然也允许您指定要使用的字节序。(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第二次调用 to 中的强制转换CopyBytes是多余的,但为了清楚起见(请记住前一行!)。

编辑:如果您宁愿坚持使用 .NET 标准库,则另一种选择是使用 .NET 标准BinaryWriterMemoryStream

于 2009-03-28T18:20:29.067 回答
0

你不能。C# 是强类型的。一个变量只有一种类型,而且只有一种类型。不允许使用像 C++ reinterpret_cast 这样的诡计。

不过,有几种方法可以解决您的问题。第一个也是显而易见的,是使用内置的序列化框架。除非必须,否则不要费心编写自己的序列化代码。而在 .NET 中,您不必经常这样做。

第二种是使用 BitConverter 类(GetBytes 方法应该可以完成转换为字节数组的技巧)

于 2009-03-28T18:22:50.057 回答