为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
Qyouu 2019-12-12 14:10:18
在允许我们通过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个字符串?
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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


我的MiscUtil库有一个EndianBitConverter类,它允许您定义字节序;BinaryReader / Writer有类似的等效项。恐怕没有在线使用指南,但它们并不重要:)


(EndianBitConverter还具有普通BitConverter中不存在的功能,该功能可以在字节数组中就地进行转换。)



查看完整回答
反对 回复 2019-12-13
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

关于小尾数,简短的答案(我需要做任何事情)是“可能没有,但这取决于您的硬件”。您可以通过以下方式进行检查:


bool le = BitConverter.IsLittleEndian;

根据这句话,您可能希望反转缓冲区的某些部分。另外,乔恩斯基特具有特定端转换这里(寻找EndianBitConverter)。


请注意,例如,钛是大端的。大多数英特尔都是低端的。


是特定的UDP / IP ...吗?



查看完整回答
反对 回复 2019-12-13
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

您需要了解网络字节顺序以及CPU字节序。


通常,对于TCP / UDP通讯,您总是使用htons函数(和ntohs和它们及其相关函数)将数据转换为网络字节顺序。


通常,网络顺序为高位优先,但在这种情况下(出于某种原因!),通信是低位优先,因此这些功能不是很有用。这很重要,因为您不能假设它们实现的UDP通讯遵循任何其他标准,如果您使用的是大端架构,这也将给您带来生活上的困难,因为您无法按需包装所有内容htons:-(


但是,如果您使用的是Intel x86架构,那么您已经是低位字节序了,因此只需发送数据而无需进行转换。



查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 328 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信