ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 在编写跨平台位级代码时,字大小和字节顺序是否相互影响?

2019-06-28 16:55:42  阅读:133  来源: 互联网

标签:c endianness


我只是看了this答案,它给出了以下示例代码,将int转换为字节数组:

int intValue;
byte[] intBytes = BitConverter.GetBytes(intValue);
if (BitConverter.IsLittleEndian)
    Array.Reverse(intBytes);
byte[] result = intBytes;

我查了Endianness,发现字节的反转(或缺少字节)是一个单词的级别,它没有固定的长度.

上面的代码是否依赖于int是1个单词的大小?如果是这样,您将如何编写平台无关的代码?

作为旁注,我相当肯定我记得,在当天,查看调试器的内存视图,并且必须反转2组2字节以构造4字节值…这就是让我的思考这个问题..

解决方法:

要正确处理字节序,您需要知道两件事:数据是大端还是小端,以及给定数据单元的大小.

这并不意味着您无法处理不同长度的数据.这确实意味着您需要知道您正在处理的数据大小.

但无论如何这是真的.如果通过网络收到一系列字节(例如),则需要知道如何解释它们.如果你得到32个字节,那可能是文​​本,它可能是8个32位整数,也可能是4个64位整数,或者其他什么.

如果您期望32位整数,那么您需要一次处理32位(4字节)的字节序.如果您期望64位整数,则一次8个字节.这与为您的CPU架构,您的语言或托管运行时定义的“单词”无关.它与您的代码处理的协议有关.

即使在给定协议内,不同的数据也可以是不同的大小.你可能混合使用short,int和long,你需要适应它.

这与以下原因完全相同: BitConverter或BinaryReader使用或生成不同数量的字节,具体取决于您要检索的数据类型.只是不是消耗或生成不同数量的字节,而是反向(或者,如果平台字节序与协议匹配),则反转不同的字节数.

在你的例子中,如果你传递给BitConverter.GetBytes()一个long,那么编译器选择的重载就是采用long而不是int的方法,它将返回8个字节而不是4个字节.并且反转整个八个字节将是正确的做法.

标签:c,endianness
来源: https://codeday.me/bug/20190628/1317397.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有