c# - 编写跨平台位级代码时,字长和字节顺序会相互作用吗?

标签 c# endianness

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

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

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

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

作为旁注,我很确定我记得,回到当天,查看调试器的内存 View 并且必须反转 2 组 2 字节以构造 4 字节值......这是是什么让我想到了这个问题..

最佳答案

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

这并不意味着您不能处理不同长度的数据。它确实意味着您需要知道您正在处理的数据有多大。

但这无论如何都是事实。如果您通过网络接收到一系列字节(例如),您需要知道如何解释它们。如果你得到 32 个字节,它可能是文本,它可能是八个 32 位整数,它可能是四个 64 位整数,或其他任何东西。

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

即使在给定的协议(protocol)中,不同的数据片段也可能有不同的大小。您可能混合使用了 shortintlong,您需要适应这种情况。

这与例如BitConverterBinaryReader 使用或生成不同数量的字节,具体取决于您检索的数据类型。只是不是消耗或生成不同数量的字节,而是反转(或不反转,如果平台字节顺序与协议(protocol)匹配)不同的字节数。

在您的示例中,如果您向 BitConverter.GetBytes() 传递了一个 long,那么编译器选择的重载将是采用 long 的方法 而不是 int ,它将返回八个字节而不是四个。反转整个八个字节是正确的做法。

关于c# - 编写跨平台位级代码时,字长和字节顺序会相互作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981527/

相关文章:

Ruby 如何将 32 位整数转换为网络字节序?

c - 读取 SQLite header

c# - 我们可以在 C# 中在运行时动态交换程序集吗

c# - MSTEST 中的 DataTestMethod 和 DataRow 属性

c# - 这些按位运算在做什么

c# - 如何一点一点地建立一个 Linq to Sql where 子句?

java - 无法收听 .wav 音频文件?

c++ - 在 C++ 中定义 UTF-16BE 字符串

bluetooth - 苹果心率监测实例及蓝牙心率测量特性字节序

c# - 除了默认 XML 之外,如何启用更多输出格式?