Как поменять 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);
}

объяснение:

  1. скажем,val, например, 0xAABB.
  2. Маска val чтобы получить LSB по &ing с 0xFF: результат 0xBB.
  3. Shift этот результат 8 бит влево: результат 0xBB00.
  4. Shift val 8 бит вправо: результат 0xAA (LSB "упал" с правой стороны).
  5. маска, которая результат для получения LSB по &ing с 0xFF: результат 0xAA.
  6. объедините результаты шагов 3 и 5 с помощью |ing их вместе:
    0xBB00 | 0xAA is 0xBBAA.

function swap32(val) {
    return ((val & 0xFF) << 24)
           | ((val & 0xFF00) << 8)
           | ((val >> 8) & 0xFF00)
           | ((val >> 24) & 0xFF);
}

объяснение:

  1. скажем,val, например, 0xAABBCCDD.
  2. Маска val чтобы получить LSB по &ing с 0xFF: результат 0xDD.
  3. Shift этот результат 24 бита влево: результат 0xDD000000.
  4. Маска val получить второй байт &ing с 0xFF00: результат 0xCC00.
  5. Shift этот результат 8 бит влево: результат 0xCC0000.
  6. Shift val 8 бит вправо: результат 0xAABBCC (LSB "упал" с правой стороны).
  7. маска, которая результате получить второй байт &ing с 0xFF00: результат 0xBB00.
  8. Shift val 24 бита справа: результат 0xAA (все, кроме MSB, "упало" с правой стороны).
  9. маскируйте этот результат, чтобы получить LSB по &ing с 0xFF: результат 0xAA.
  10. объедините результаты шагов 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. Вы видите разницу только при просмотре отдельных байтов в памяти использование указателей.