读取以两端格式表示的数字?

时间:2015-10-25 02:08:12

标签: c# endianness

从概念上讲,我很难理解32位无符号整数(4个字节)如何表示为8个字节,其中前四个使用little-endian格式编码,最后四个使用big-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位无符号整数的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

这是ISO标准的典型特征。该组织不擅长制定体面的标准,只擅长在其成员之间建立妥协。他们这样做的两种基本方式,就是选择一个让每个人都同样不高兴的标准。或者选择不止一个,这样每个人都可以开心。对数字进行两次编码属于后一类。

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

由于您的计算机是little-endian,因此您只关心little-endian值。简单地忽略big-endian等价物。从技术上讲,你可以添加一个检查,它们是相同的,但这只是浪费精力。