C#little endian还是big endian?

Tim*_*hyP 62 c# hardware udp endianness

在允许我们通过UDP/IP控制它的硬件文档中,我发现了以下片段:

在这种通信协议中,DWORD是4字节数据,WORD是2字节数据,BYTE是单字节数据.存储格式为小端,即4字节(32位)数据存储为:d7-d0,d15-d8,d23-d16,d31-d24; 双字节(16位)数据存储为:d7-d0,d15-d8.

我想知道这是如何转换为C#的?在发送之前我是否必须转换内容?例如,如果我想发送32位整数或4个字符的字符串?

Jon*_*eet 80

C#本身没有定义字节序.但是,无论何时转换为字节,您都可以做出选择.该BitConverter类有一个IsLittleEndian场告诉你这将如何表现,但它不给的选择.BinaryReader/BinaryWriter也是如此.

我的MiscUtil库有一个EndianBitConverter类,允许你定义字节序; BinaryReader/Writer有类似的等价物.没有在线使用指南我很害怕,但它们是微不足道的:)

(EndianBitConverter还有一个功能,它在普通的BitConverter中不存在,它在字节数组中就地进行转换.)

  • 还记得在C#中可以直接复制值,例如*ptr = value; 在这种情况下,您应该关注计算机体系结构的字节顺序. (3认同)
  • 我认为您的 MiscUtil 库应该重定向到 System.Memory:System.Buffer.Binary.BinaryPrimitives。我相信 JIT 编译器将对这些方法进行特殊处理,以使用比 C# 代码更快的硬件指令。 (2认同)

Jan*_*ter 46

你也可以使用

IPAddress.NetworkToHostOrder(...)
Run Code Online (Sandbox Code Playgroud)

简而言之,int或long.

  • -1,因为这仅适用于与 *Big Endian* 之间的转换,并且 OP 特别要求转换为 *Little Endian*。特别是,该函数只会在 Little Endian 主机(OP 不需要它)上执行某些操作,而在 Big Endian 主机(OP 需要该功能)上*不执行任何操作*。 (3认同)

Mar*_*ell 10

Re little-endian,简短的回答(我需要做什么)是"可能不是,但这取决于你的硬件".您可以查看:

bool le = BitConverter.IsLittleEndian;
Run Code Online (Sandbox Code Playgroud)

根据这说明,您可能想要反转部分缓冲区.或者,Jon Skeet 在这里有特定的端序转换器(寻找EndianBitConverter).

请注意,itaniums(例如)是big-endian.大多数英特尔都是小端的.

重新具体的UDP/IP ......?