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

Reading numbers represented in both-endian format?

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

我特别指的是 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 标准来说是非常典型的。该组织不太擅长制定体面的标准,只擅长在其成员之间做出妥协。他们这样做的两种基本方式,他们要么选择一个让每个人都同样不开心的糟糕标准。或者选择多个,这样每个人都能开心。对数字进行两次编码属于后一类。

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

因为你的机器是小端的,所以你只关心小端的值。简单地忽略大端等价物。从技术上讲,您可以添加检查它们是否相同,但这只是浪费精力。