Как поменять endian-ness (порядок байтов) переменной в javascript
Я получаю и отправляю десятичное представление двух маленьких конечных чисел. Я хотел бы:
- shift одна переменная 8 бит влево
- и их
- shift переменное количество бит
- создайте 2 8 разрядных числа, представляющих первую и вторую половину 16-разрядного числа.
javascript (согласно https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators) использует большое представление на прямой при переключении...
endianness немного чужда мне (я только на 90 процентов уверен, что мои намеченные шаги-это то, что я хочу. так что обмен немного головокружителен. пожалуйста, помогите! Мне просто нужно знать, как эффективно поменять заказ. (Я могу думать только об использовании цикла for на возвращаемом значении toString ())
3 ответов
function swap16(val) {
return ((val & 0xFF) << 8)
| ((val >> 8) & 0xFF);
}
объяснение:
- скажем,
val
, например,0xAABB
. - Маска
val
чтобы получить LSB по&
ing с0xFF
: результат0xBB
. -
Shift этот результат 8 бит влево: результат
0xBB00
. -
Shift
val
8 бит вправо: результат0xAA
(LSB "упал" с правой стороны). - маска, которая результат для получения LSB по
&
ing с0xFF
: результат0xAA
. - объедините результаты шагов 3 и 5 с помощью
|
ing их вместе:0xBB00 | 0xAA
is0xBBAA
.
function swap32(val) {
return ((val & 0xFF) << 24)
| ((val & 0xFF00) << 8)
| ((val >> 8) & 0xFF00)
| ((val >> 24) & 0xFF);
}
объяснение:
- скажем,
val
, например,0xAABBCCDD
. - Маска
val
чтобы получить LSB по&
ing с0xFF
: результат0xDD
. -
Shift этот результат 24 бита влево: результат
0xDD000000
. - Маска
val
получить второй байт&
ing с0xFF00
: результат0xCC00
. -
Shift этот результат 8 бит влево: результат
0xCC0000
. -
Shift
val
8 бит вправо: результат0xAABBCC
(LSB "упал" с правой стороны). - маска, которая результате получить второй байт
&
ing с0xFF00
: результат0xBB00
. -
Shift
val
24 бита справа: результат0xAA
(все, кроме MSB, "упало" с правой стороны). - маскируйте этот результат, чтобы получить LSB по
&
ing с0xFF
: результат0xAA
. - объедините результаты шагов 3, 5, 7 и 9 с помощью
|
ing ними вместе:0xDD000000 | 0xCC0000 | 0xBB00 | 0xAA
и0xDDCCBBAA
.
такую функцию можно использовать для изменения endianness в js:
const changeEndianness = (string) => {
const result = [];
let len = string.length - 2;
while (len >= 0) {
result.push(string.substr(len, 2));
len -= 2;
}
return result.join('');
}
changeEndianness('AA00FF1234'); /// '3412FF00AA'
используйте оператор
Я действительно думаю, что базовая реализация JavaScript будет использовать любую endianess платформу, на которой она работает. Поскольку вы не можете напрямую обращаться к памяти в JavaScript, вам никогда не придется беспокоиться о том, как числа физически представлены в памяти. Битовые целочисленные значения сдвига всегда дают один и тот же результат независимо от endianess. Вы видите разницу только при просмотре отдельных байтов в памяти использование указателей.