缓冲区函数中的BE或LE是什么意思?

3
我有一个用于读取二进制数据的PHP类,我正在将其转换为NodeJS或查找在NodeJS中的一些等效函数。我感兴趣的是BinaryReader类中的ReadULong和ReadUShort函数。我相信这些函数意味着读取无符号长整型(4个字节)和无符号短整型(2个字节)。当我尝试在NodeJS中找到它们的等效函数时,我会对使用哪个函数感到困惑:
buf.readUInt16LE(offset, [noAssert])
buf.readUInt16BE(offset, [noAssert])

buf.readUInt32LE(offset, [noAssert])
buf.readUInt32BE(offset, [noAssert])

在这种情况下,“LE”或“BE”代表什么?
缓冲区文档位于此处,但我无法找到对这些这里的解释。
此外,我在PHP类中发现了一个常量,它说const DEFAULT_BYTE_ORDER = 'L';。这个 L 是否与 readUInt32LE 中的 L 相同?这整个事情是否涉及字节顺序?
到目前为止,我已阅读了这些文章:

如果能给我提供更多关于二进制读取的参考资料,那将不胜感激!


4
http://en.wikipedia.org/wiki/Endianness - Oliver Charlesworth
@OliCharlesworth 噢,原来是大端和小端!谢谢你给我一个起点! - Logan
1个回答

8

BE和LE分别代表大端序和小端序。在大端序中,最高有效字节存储在最小的地址中,在小端序中,最低有效字节存储在最小的地址中。也就是说,字节序指示了字节的顺序。您可以在文档的一个示例中看到这种模式:

var buf = new Buffer(2);

buf[0] = 0x3;
buf[1] = 0x4;

buf.readUInt16BE(0);
buf.readUInt16LE(0);

// 0x0304
// 0x0403

如果我们考虑十进制数字,在内存中,LE中的4567看起来像7|6|5|4,而BE则看起来像4|5|6|7,对吧?我想知道为什么要这样分开...是为了更容易地获取第一个数字吗?例如,如果我想从中获取7,我的arrayLE[0]将是7,而arrayBE[3]也将是7。如果我不知道这个东西有多长,这会有所帮助,但是一开始我会使用16位32位读取函数。因此,我不是已经知道第一个字节在哪里了吗? - Logan
啊!在看了例子之后,我知道BE和LE代表什么,我能理解它们的重要性。这是关于查找偏移量旁边的下一个字节,使用BE;以及查找该偏移量之前的字节,使用LE。你能确认一下吗? - Logan
BE和LE只是找出数据的排序方式,以便正确读取它。以4567为例,将其转换为十六进制。如果我们有一个长度为2的缓冲区,var buf = new Buffer(2);并且我们设置值如下:buf[0] = 0x11; buf[1] = 0xD7;,我们得到这个缓冲区:<Buffer 11 d7>。这是大端序,所以如果我们这样读取:buf.readUInt16BE(0),我们得到4567。如果我们尝试按小端序读取,我们得到55057。如果我们反转缓冲区的顺序,buf[0] = 0xD7; buf[1] = 0x11;,现在它是小端序,buf.readUInt16BE(0)返回4567 - hexacyanide
1
回到你最初的评论,4567在十六进制中是大端序表示为11|D7,小端序表示为D7|11。如果你以错误的字节序读取这些数字,那么你会得到55057 - hexacyanide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接