C#小尾数法还是大尾数法?

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


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


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


繁花不似锦
浏览 483回答 3
3回答

慕运维8079593

C#本身未定义字节序。但是,无论何时转换为字节,您都在做出选择。该BitConverter类有一个IsLittleEndian场告诉你这将如何表现,但它不给的选择。BinaryReader / BinaryWriter也是如此。我的MiscUtil库有一个EndianBitConverter类,它允许您定义字节序;BinaryReader / Writer有类似的等效项。恐怕没有在线使用指南,但它们并不重要:)(EndianBitConverter还具有普通BitConverter中不存在的功能,该功能可以在字节数组中就地进行转换。)

青春有我

关于小尾数,简短的答案(我需要做任何事情)是“可能没有,但这取决于您的硬件”。您可以通过以下方式进行检查:bool le = BitConverter.IsLittleEndian;根据这句话,您可能希望反转缓冲区的某些部分。另外,乔恩斯基特具有特定端转换这里(寻找EndianBitConverter)。请注意,例如,钛是大端的。大多数英特尔都是低端的。是特定的UDP / IP ...吗?

繁星点点滴滴

您需要了解网络字节顺序以及CPU字节序。通常,对于TCP / UDP通讯,您总是使用htons函数(和ntohs和它们及其相关函数)将数据转换为网络字节顺序。通常,网络顺序为高位优先,但在这种情况下(出于某种原因!),通信是低位优先,因此这些功能不是很有用。这很重要,因为您不能假设它们实现的UDP通讯遵循任何其他标准,如果您使用的是大端架构,这也将给您带来生活上的困难,因为您无法按需包装所有内容htons:-(但是,如果您使用的是Intel x86架构,那么您已经是低位字节序了,因此只需发送数据而无需进行转换。
打开App,查看更多内容
随时随地看视频慕课网APP