Что означает BE или LE в буферных функциях?

У меня есть класс 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 в этом случае?

Документация по Buffer находится здесь, но мне не удалось найти объяснение этим здесь.

Также я нашел константу в классе PHP, которая говорит const DEFAULT_BYTE_ORDER = 'L';. Это L такое же, как L в readUInt32LE? Все дело в порядках байтов?

До сих пор я читал эти статьи:

Если бы мне дали еще пару ссылок, чтобы прочитать о двоичном чтении, я был бы очень признателен!


person Logan    schedule 14.09.2013    source источник
comment
en.wikipedia.org/wiki/Endianness   -  person Oliver Charlesworth    schedule 14.09.2013
comment
@OliCharlesworth О, так это Big Endian и Little Endian! Спасибо, что дали мне возможность начать!   -  person Logan    schedule 14.09.2013


Ответы (1)


BE и LE обозначают прямой и прямой порядок байтов. При обратном порядке старший байт хранится по наименьшему адресу, а при прямом порядке младший байт хранится по наименьшему адресу. При этом endian указывает порядок байтов. Вы можете увидеть шаблон в одном из примеров в документации:

var buf = new Buffer(2);

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

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

// 0x0304
// 0x0403
person hexacyanide    schedule 14.09.2013
comment
Если бы мы подумали о числах с основанием 10, в 4567 LE выглядело бы как 7|6|5|4 в памяти, а BE выглядело бы как 4|5|6|7, верно? Интересно, почему они отделили их так... Чтобы легче было получить первую цифру с LE, я думаю? Например, если бы я хотел убрать оттуда 7, мой массив LE[0] был бы 7, а массив BE[3] также был бы 7. Это помогло бы, если бы я не знал, как долго это было, я думаю, но опять же в начале я бы использовал функции чтения 16bit или 32bit. Следовательно, разве я не знал бы, насколько далеко будет первый байт? - person Logan; 14.09.2013
comment
Ах! Посмотрев на пример, зная, что означают BE и LE, я понимаю их значение. Речь идет о том, чтобы узнать, какой байт находится рядом со смещением, с помощью BE; и выяснить, какой байт предшествует этому смещению с помощью LE. Можете ли вы подтвердить это, пожалуйста? - person Logan; 14.09.2013
comment
Таким образом, BE и LE просто выясняют, как упорядочены данные, чтобы вы могли прочитать их свойство. Возьмите свой пример 4567 и преобразуйте его в шестнадцатеричный формат. Если у нас есть буфер двух длин, 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. - person hexacyanide; 14.09.2013
comment
Вернемся к исходному комментарию: 4567 в шестнадцатеричном формате, 11|D7 в обратном порядке и D7|11 в обратном порядке. Если вы прочитаете числа с неправильным порядком байтов, вы получите 55057. - person hexacyanide; 14.09.2013