【问题标题】:Read and write from a byte stream if the endianess of the data is different from that of the current machine如果数据的字节序与当前机器的字节序不同,则从字节流中读取和写入
【发布时间】:2011-02-02 02:10:19
【问题描述】:

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

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

应该如何处理?我是否应该根据当前机器的数据检查我的数据的字节顺序,然后当我想读取双精度而不是将原始字节读取到字节数组中并执行 array.Reverse 以在使用 BitConverter.ToDouble () 与反向之前反转数据数据和零偏移?

我可以对此进行测试,但我没有两种字节序的数据源,所以我有点担心创建测试数据来测试解析,这与“真实”数据的样子不同。

【问题讨论】:

    标签: .net endianness


    【解决方案1】:

    如果字节序标志表明数据流的字节序与机器架构不同,那么这可能不起作用?

    首先 - 位顺序是从您那里抽象出来的。除非你在玩弄比特,否则你不在乎。

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

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

    通常,遇到此问题的应用程序使用多字节签名来清楚地指示顺序。换句话说,将 0x01020304 写入流,在阅读器端,如果你得到 0x04030201,你就知道你在字节序上有所不同。

    我可以对此进行测试,但我没有两种字节序的数据源...

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

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

    【讨论】:

    • 我有一个说明格式的规范。我只有一个实现示例(因此我的数据中只有一个字节顺序示例),但代码必须处理任何格式的数据。我没有在两端使用 .net。事实上,所有知道的是我有一个 byte[] 作为输入,我需要解析它以从数组中提取数据。数组的第一部分是一个标头,其中包含编码数据的字节顺序等信息。
    • 好的,这样做:在您的应用程序中,将一个常量字节数组值(例如,{0xFF, 0xFE, 0x01, 0x02})转换为一个 Int32 值。然后,对从实际数据流中收到的字节数组执行相同操作。比较它们。如果它们相同,则字节顺序相同。如果不同,那么您知道您需要反转。然后,酌情使用上述答案中链接的用于选择字节顺序的类。那应该可以。
    • 谢谢。我可以检查机器的字节序,或者至少是框架将要使用的字节序(BitConverter.IsLittleEndian),我真的想要确认使用 Array.Reverse 反转字节,而不是将这些字节传递给 BitConverter.ToDouble()如果字节序不一样,方法是正确的方法。
    • 是的,Array.Reverse 是正确的。显然,相反需要分块进行。块的大小(字节数)取决于正在读取的单个数据的大小。
    【解决方案2】:

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

    BinaryReader..::.ReadDouble

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

    如果您想读取 BigEndian 数据,您可以重写 BinaryReader 方法或添加带有枚举参数的重载以指定预期的字节序。

    要实现 bing endian 阅读,您可以查看 Cheeso 答案或做一些逆向工程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多