【问题标题】:Reading numbers represented in both-endian format?读取以双端格式表示的数字?
【发布时间】:2015-10-25 02:08:11
【问题描述】:

从概念上讲,我很难理解如何将 32 位无符号整数(即 4 个字节)表示为 8 个字节,其中前四个使用 little-endian 格式编码,后四个其中使用大端格式编码。

我特别指的是 ISO 9660 格式,它以这种方式编码一些 16 位和 32 位整数。

我尝试了以下方法,但这显然不起作用,因为BitConverter.ToUInt32() 方法仅从起始索引中获取前四个字节。

byte[] leastSignificant = reader.ReadBytes(4, Endianness.Little);
byte[] mostSignificant = reader.ReadBytes(4, Endianness.Big);

byte[] buffer = new byte[8];
Array.Copy(leastSignificant, 0, buffer, 0, 4);
Array.Copy(mostSignificant, 0, buffer, 4, 4);

uint actualValue = BitConverter.ToUInt32(buffer, 0);

读取以双端格式编码的 8 字节表示的 32 位无符号整数的正确方法是什么?

【问题讨论】:

  • ISO 9660,在 Microsoft Windows 中也称为 CDFS(Compact Disc File System),是国际标准化组织 (ISO) 针对光盘介质发布的文件系统标准。
  • 这可以追溯到微处理器的英特尔设计。地址由 16 位段寄存器 (MSB) 和 16 位偏移量 (LSB) 表示。首先是偏移量,然后是段寄存器,并且 16 位数字(2 个字节)也被交换,因此低字节先出现,然后高字节出现。
  • @jdweng 我对计算机科学/工程不太了解,但是以这种方式编码整数有什么好处?它占用了更多空间,而且(在我看来)它没有任何好处。
  • 如果这个数字实际上被存储了两次,你只需要转换它的一种表示形式。
  • @C.Evenhuis 这是我遇到的问题。我不确定我应该如何阅读它,因为我不知道值是如何存储的。我的描述不够具体。虽然,它确实说在 32 位机器上,最后四个字节被跳过了,在我看来,如果 32 位机器只能读取前四个字节并且侥幸逃脱,那么我应该能够做到好吧,对吧?

标签: c# endianness


【解决方案1】:

这对于 ISO 标准来说是非常典型的。该组织不太擅长创造体面的标准,只擅长在其成员之间创造妥协。他们这样做的两种基本方式,他们要么选择一个让每个人都同样不开心的糟糕标准。或者选择不止一个,这样每个人都能开心。对数字进行两次编码属于后一类。

这样做有一些理由。光盘有很多复制起来非常便宜的位。它们的格式通常旨在使播放硬件尽可能便宜。掌握磁盘通常非常令人费解,因此,BlueRay 标准特别痛苦。

由于您的机器是 little-endian,因此您只关心 little-endian 值。只需忽略 big-endian 等效项。从技术上讲,您可以添加一个检查它们是否相同,但这只是浪费精力。

【讨论】:

  • 我的机器实际上是 64 位的,但我只是说如果 32 位机器只能读取第一个,而 64 位机器也可以。无论如何,所以它真的只是同一个数字以两种不同的方式编码两次?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多