Подтвердить что ты не робот

Как заменить константу (байтовый порядок) переменной в javascript

Я получаю и отправляю десятичное представление двух маленьких конечных чисел. Я бы хотел:

  • сдвинуть одну переменную 8 бит влево
  • ИЛИ их
  • сдвинуть переменное количество бит
  • создать 2 8-битных номера, представляющих первую и вторую половину 16-разрядного номера.

javascript (согласно https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators) использует широкоэкранное представление при смене...

endianness немного чуждо мне (я только на 90 процентов уверен, что мои намеченные шаги - это то, что я хочу.), поэтому замена немного головокружительна. пожалуйста помоги! Мне действительно нужно знать, как эффективно менять порядок. (Я могу думать только об использовании цикла for для возвращаемого значения toString())

4b9b3361

Ответ 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'