我只是在看 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)中,不同的数据片段也可能有不同的大小。您可能混合使用了 short
、int
和 long
,您需要适应这种情况。
这与例如BitConverter
或 BinaryReader
使用或生成不同数量的字节,具体取决于您检索的数据类型。只是不是消耗或生成不同数量的字节,而是反转(或不反转,如果平台字节顺序与协议(protocol)匹配)不同的字节数。
在您的示例中,如果您向 BitConverter.GetBytes()
传递了一个 long
,那么编译器选择的重载将是采用 long 的方法
而不是 int
,它将返回八个字节而不是四个。反转整个八个字节是正确的做法。
关于c# - 编写跨平台位级代码时,字长和字节顺序会相互作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981527/