代码之家  ›  专栏  ›  技术社区  ›  Sam Holder Brian Adams

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

  •  0
  • Sam Holder Brian Adams  · 技术社区  · 16 年前

    我有一个字节流,其中包含一个标识头中数据的结束地址的标志。我想从流中读取double,如果头中数据的endianness不同,那么可能需要不同的double?

    我目前正在使用BinaryReader并调用readDouble从流中读取数据,但是如果endianness标志表明数据流的endianness与机器体系结构不同,那么这可能不起作用?

    该如何处理?当我想读取一个双精度数而不是将原始字节读取到一个字节数组中并执行数组时,我是否应该对照当前机器的数据检查数据的端序呢?在使用带反向数据和零偏移量的bitconverter.to double()之前,是否反转以反转数据?

    我可以测试这个,但是我没有用于两个endianness的数据源,所以有点担心创建测试数据来测试解析,这与“真实”数据的外观不同。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    如果endianness标志表明数据流的endianness与机器体系结构的endianness不同,那么这可能不起作用?

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

    字节顺序是另一回事。对于4字节的数量,它可以是最低有效字节第一个或最高有效字节第一个。我不知道readDouble()使用的是什么,但是如果您在连接的一端使用BinaryReader,在另一端使用BinaryWriter,那么再一次,您不在乎。它的书写顺序应与阅读顺序相同,而不考虑结尾。

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

    通常,面临此问题的应用程序使用多字节签名来清楚地指示顺序。换言之,在流中写入0x0102304,在读卡器端,如果得到0x04030201,就知道在结束语方面有区别。

    我可以测试这个,但我没有数据源来实现双端性…

    你得解决这个问题。如果没有能力测试你正在开发的东西,你就无法开发。这也引出了一个问题:如果你没有一个使用不同结尾的源代码,那么你为什么要担心这个问题呢?

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

        2
  •  0
  •   Guillaume    16 年前

    BinaryReader在Little Endian中读取数据(包括双精度):

    BinaryReader..::.ReadDouble

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

    如果要读取bigendian数据,可以重写binaryreader方法,或者使用枚举参数添加重载以指定预期的endianness。

    要实现bing-endian阅读,您可以查看cheeso答案或执行一些反向工程。

    推荐文章