【问题标题】:does endianness cause read or write operation conflicts?字节序会导致读取或写入操作冲突吗?
【发布时间】:2019-12-05 18:14:25
【问题描述】:

就我而言,字节序只影响字节,但我仍然不知道它是否会影响单个位。

我知道网络字节顺序。但是,我不确定是否有输入或文件 I/O 的标准。更具体地说,类似 NES ROM 仿真器/解码器。 假设 NES 本质上是小端,翻转了它的所有位,然后在大端机器上的 NES 仿真器的程序员不会意识到这些位需要反转才能继续。

当然,如果有一个读取文件静态数据的标准,那当然不是问题。

如果小端机器将数据写入文件。直观地说,我不禁假设这些位是向后存储的。 (我确定保证字节顺序相反)

所以如果一个小端机器写入数据,比如说一个 ROM 文件,这是否意味着它的所有位都必须翻转才能让大端机器读取它?

【问题讨论】:

  • 澄清一下:字节序是关于多字节值中的字节顺序。字节中的位如何存储无关紧要,因为没有程序可以单独读取或写入内存中的位。

标签: c++


【解决方案1】:

字节序是关于一个块中字节的顺序。

你在一个系统上的位:

 byte 1   byte 2   byte 3
ABCDEFGH IJKLMNOP QRSTUVWX

在具有相反字节序的系统上看起来像这样(中间字节序也存在,但我们暂时忽略它),直到你纠正它:

 byte 1   byte 2   byte 3
QRSTUVWX IJKLMNOP ABCDEFGH

所以字节以不同的顺序被读取,但每个字节的值没有单独改变。

但是,如果整数在一个平台上以一种方式(例如,二进制补码)表示,而在另一个平台上以另一种方式(例如,一个补码)表示,则构成整数的位将无法在这些平台之间移植即使您考虑了字节序差异。您必须自己考虑。

【讨论】:

    【解决方案2】:

    如果我理解正确,您问的是从另一台机器传输的文件是否有可能在每个字节 (10110000 -> 00001101) 中反转位,如果没有,为什么不。

    文件被定义为由字节组成(这是由人组成的定义)。每当您复制文件时,副本都具有与原始文件相同的字节。如果这没有发生,那么我们会打电话给编写复制程序的人,称他们为白痴。编写复制程序的人不想被称为白痴,所以他们确保他们的复制程序正确地复制字节。

    当文件在两个不同的系统之间传输时也是如此。设计网络的人也不想被称为白痴,所以他们确保网络两端的计算机知道字节的哪一端是高端,哪一端是低端。以太网以 little-endian 顺序发送位,但这并不重要,因为您实际上从未以任何顺序看到这些位 - 您只能看到整个字节。

    如果你使用软盘(还记得吗?),设计软盘的人也不想被称为白痴,所以他们确保所有使用软盘的计算机都将位放在同一个每个字节内的顺序...看到模式了吗?

    当有人设计电路来转储 NES ROM 时,他们会做同样的事情。他们确保如果 NES 将一个字节视为 10110000,那么计算机也会如此。 NES是否在其电路板的左侧具有MSB并且计算机在其电路板的右侧具有MSB并不重要-这仅意味着设计人员必须交换电线(或记下让软件编写者去做)。如果这没有发生,则宣布 NES 转储器电路损坏。制造电路的人给自己打电话,称自己是制造电路故障的白痴,然后他们修复它。

    可能他们故意以错误的顺序转储位,以使电路更简单,但我们仍然称之为错误,我们知道软件必须在将 ROM 数据保存到硬盘之前修复它。

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多