C# 如何在C中将dword转换为字节数组# 正如你已经知道的,我正在迁移到C++中,C++中的一些东西看起来不一样。

C# 如何在C中将dword转换为字节数组# 正如你已经知道的,我正在迁移到C++中,C++中的一些东西看起来不一样。,c#,byte,dword,C#,Byte,Dword,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 +

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);
注意:矮星和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];
    
    可以使用在字节数组之间转换数据。不幸的是,没有工具可以复制到现有阵列中。My中我自己的
    EndianBitConverter
    允许您在需要时使用它,当然也允许您指定要使用的endianness。(
    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);
    
    等等。在对
    CopyBytes
    的第二次调用中,对
    int
    的转换是多余的,但为了清晰起见(请记住前一行!)

    编辑:另一种选择,如果您希望坚持使用.NET标准库,您可能希望使用。

    您不能。C#是强类型的。一个变量只有一种类型。不允许像C++重新解释TICAST那样的欺骗。 不过,有几种方法可以解决您的问题。第一个,也是显而易见的,是使用内置的序列化框架。除非必须,否则不要费心编写自己的序列化代码。在.NET中,您通常不必这样做


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

    @Jon Skeet,谢谢!你能检查一下你的库是否允许你做这项工作吗)。另外,如果能举一个例子说明它是如何工作的,我们会非常感激。强类型并不意味着你不能像整数类型那样处理原语值类型中的位和字节。CLR类型系统中最强的限制是在引用类型之间强制转换。@Cecil:不,无法在OP要求的类型之间强制转换。当然,您可以使用任意数量的转换/序列化类和函数根据源对象的值创建一个新对象,但您不能使用一种类型的对象,并一直假装它有另一种类型,这是OP所询问的特定方法。