Как поменять 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 val8 бит вправо: результат0xAA(LSB "упал" с правой стороны).
- маска, которая результат для получения LSB по &ing с0xFF: результат0xAA.
- объедините результаты шагов 3 и 5 с помощью |ing их вместе:0xBB00 | 0xAAis0xBBAA.
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 val8 бит вправо: результат0xAABBCC(LSB "упал" с правой стороны).
- маска, которая результате получить второй байт &ing с0xFF00: результат0xBB00.
- 
 Shift val24 бита справа: результат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. Вы видите разницу только при просмотре отдельных байтов в памяти использование указателей.
