如何在D#中将双字转换为字节数组

时间:2009-03-28 18:15:11

标签: c# byte dword

正如您可能已经知道的那样,我正在迁移到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
  5. 等等

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

    我尝试了这个,但它不起作用

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

2 个答案:

答案 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标准库,另一种选择,您可能希望将BinaryWriterMemoryStream一起使用。

答案 1 :(得分:0)

你做不到。 C#是强类型的。变量只有一种,只有一种。不允许像C ++ reinterpret_cast这样的诡计。

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

第二种是使用BitConverter类(GetBytes方法应该转换为字节数组)