如果数据的字节顺序与当前机器的字节顺序不同,则从字节流中读取和写入

时间:2010-03-29 14:55:25

标签: .net endianness

我有一个字节流,其中包含一个标志,用于标识标头中数据的字节顺序。我想从流中读取双精度数,如果标题中数据的字节顺序不同,可能会有所不同?

我目前正在使用BinaryReader并调用ReadDouble来读取流中的数据,但是如果endianness标志指示数据流的字节序不同于机器架构,那么可能这不起作用?

应如何处理?我应该检查我的数据的字节顺序与当前机器的字节顺序,然后当我想读取一个double而不是将字节raw读入一个字节数组并执行array.Reverse以在使用BitConverter.ToDouble()之前反转数据数据和零偏移?

我可以测试一下,但是我没有两个endianness的数据源,所以有点担心创建测试数据来测试解析,这与'真实'数据可能看起来不同。

2 个答案:

答案 0 :(得分:1)

  

如果endianness标志表明数据流的端点不同于机器架构,那么可能这不起作用?

首先 - 从您那里抽象出位顺序。除非你是小事,否则你不在乎。

字节顺序是另一回事。对于4字节数量,它可以是最低有效字节优先或最高有效字节优先。我不知道ReadDouble()使用了什么,但是如果你在导线的一端使用BinaryReader而在另一端使用BinaryWriter,那么再一次,你不在乎。它应该按照读取的顺序编写,而不考虑字节顺序。

在我看来,唯一可以关心的情况是,如果你不在电线的另一端使用.NET。在这种情况下,您必须使用类似于您描述的方案确保字节顺序正确。 (Array.Reverse等)。

通常,面临此问题的应用程序使用多字节签名来清楚地指示顺序。换句话说,将0x01020304写入流,而在读取器端,如果得到0x04030201,则表示您在字节序上有所不同。

  

我可以测试一下,但我没有两个字节序的数据来源......

你必须解决这个问题。没有能力测试你正在开发的东西,你就无法发展。它还提出了一个问题:如果你没有使用不同字节序的源,那你为什么要担心这个问题呢?

另见:
  - Reversing byte order in .NET
  - A class for choosing the endianness of BitConverter

答案 1 :(得分:0)

BinaryReader以little endian读取数据(包括双精度数):

BinaryReader..::.ReadDouble

  

BinaryReader以little-endian格式读取此数据类型。

如果要读取BigEndian数据,可以覆盖BinaryReader方法或使用enum参数添加重载以指定预期的字节顺序。

要实现bing endian阅读,你可以看看Cheeso的答案或做一些反向的改造。