Как заменить константу (байтовый порядок) переменной в javascript
Я получаю и отправляю десятичное представление двух маленьких конечных чисел. Я бы хотел:
- сдвинуть одну переменную 8 бит влево
- ИЛИ их
- сдвинуть переменное количество бит
- создать 2 8-битных номера, представляющих первую и вторую половину 16-разрядного номера.
javascript (согласно https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators) использует широкоэкранное представление при смене...
endianness немного чуждо мне (я только на 90 процентов уверен, что мои намеченные шаги - это то, что я хочу.), поэтому замена немного головокружительна. пожалуйста помоги! Мне действительно нужно знать, как эффективно менять порядок. (Я могу думать только об использовании цикла for для возвращаемого значения toString())
Ответы
Ответ 1
function swap16(val) {
return ((val & 0xFF) << 8)
| ((val >> 8) & 0xFF);
}
Пояснение:
- Скажем, что
val
- это, например, 0xAABB
.
- Маска
val
, чтобы получить LSB &
ing с 0xFF
: result is 0xBB
.
- Shift, которые выводят 8 бит влево: результат
0xBB00
.
- Shift
val
8 бит вправо: результат 0xAA
(LSB имеет "выгружен" справа, стороны).
- Маска, которая приведет к получению LSB с помощью
&
ing с 0xFF
: result is 0xAA
.
- Объедините результаты шагов 3 и 5 с помощью
|
вместе:
0xBB00 | 0xAA
- 0xBBAA
.
function swap32(val) {
return ((val & 0xFF) << 24)
| ((val & 0xFF00) << 8)
| ((val >> 8) & 0xFF00)
| ((val >> 24) & 0xFF);
}
Пояснение:
- Скажем, что
val
- это, например, 0xAABBCCDD
.
- Маска
val
, чтобы получить LSB &
ing с 0xFF
: result is 0xDD
.
- Shift, результат 24 бит влево: результат
0xDD000000
.
- Маска
val
, чтобы получить второй байт &
ing с 0xFF00
: result is 0xCC00
.
- Shift, которые выводят 8 бит влево: результат
0xCC0000
.
- Shift
val
8 бит вправо: результат 0xAABBCC
(у LSB есть" стороны).
- Маска, которая приведет к получению второго байта
&
ing с 0xFF00
: result is 0xBB00
.
- Shift
val
24 бита вправо: результат 0xAA
(все, кроме MSB, "выпало" правая сторона).
- Маска, которая приведет к получению LSB с помощью
&
ing с 0xFF
: result is 0xAA
.
- Объедините результаты шагов 3, 5, 7 и 9 с помощью
|
ing вместе:
0xDD000000 | 0xCC0000 | 0xBB00 | 0xAA
- 0xDDCCBBAA
.
Ответ 2
Используйте < (бит сдвига). Пример: 1 < 2 == 4.
Я действительно думаю, что базовая реализация JavaScript будет использовать любую endianess, на которой работает эта платформа. Поскольку вы не можете напрямую обращаться к памяти в JavaScript, вам никогда не придется беспокоиться о том, как физически представлены числа в памяти. Целочисленные значения смещения битов всегда дают одинаковый результат независимо от его конечности. Вы видите только разницу при просмотре отдельных байтов в памяти с помощью указателей.
Ответ 3
Такая функция может быть использована для изменения сущности в 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'