【发布时间】: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