Чтение байтов от строки JavaScript

У меня есть строка, содержащая двоичные данные в JavaScript. Теперь я хочу считать, например, целое число от него. Таким образом, я получаю первые 4 символа, использовать charCodeAt, сделайте некоторое смещение, и т.д. для получения целого числа.

Проблема состоит в том, что строки в JavaScript являются UTF-16 (вместо ASCII) и charCodeAt часто возвращает значения выше, чем 256.

Ссылка Mozilla указывает, что "Первые 128 кодовых точек Unicode являются прямым соответствием кодировки символов ASCII". (что относительно значений ASCII> 128?).

Как я могу преобразовать результат charCodeAt к значению ASCII? Или есть ли лучший способ преобразовать строку четырех символов к 4-байтовому целому числу?

32
задан Peter Mortensen 13 February 2011 в 18:23
поделиться

3 ответа

Я считаю, что это можно сделать с помощью относительно простых битовых операций:

function stringToBytes ( str ) {
  var ch, st, re = [];
  for (var i = 0; i < str.length; i++ ) {
    ch = str.charCodeAt(i);  // get char 
    st = [];                 // set up "stack"
    do {
      st.push( ch & 0xFF );  // push byte to stack
      ch = ch >> 8;          // shift value down by 1 byte
    }  
    while ( ch );
    // add stack contents to result
    // done because chars have "wrong" endianness
    re = re.concat( st.reverse() );
  }
  // return an array of bytes
  return re;
}

stringToBytes( "A\u1242B\u4123C" );  // [65, 18, 66, 66, 65, 35, 67]

Суммирование вывода должно быть простым считыванием массив байтов, как если бы это была память, и сложение его в более крупные числа:

function getIntAt ( arr, offs ) {
  return (arr[offs+0] << 24) +
         (arr[offs+1] << 16) +
         (arr[offs+2] << 8) +
          arr[offs+3];
}

function getWordAt ( arr, offs ) {
  return (arr[offs+0] << 8) +
          arr[offs+1];
}

'\\u' + getWordAt( stringToBytes( "A\u1242" ), 1 ).toString(16);  // "1242"
37
ответ дан 27 November 2019 в 20:00
поделиться

Как вы вообще поместили двоичные данные в строку? Как двоичные данные кодируются в строку, является ВАЖНЫМ соображением, и вам нужен ответ на этот вопрос, прежде чем вы сможете продолжить.

Один из известных мне способов получить двоичные данные в строке - это использовать объект XHR, и установите для него ожидание UTF-16.

Как только он находится в UTF-16, вы можете получить 16-битные числа из строки, используя «....». CharCodeAt (0)

, который будет числом от 0 до 65535

Затем, если хотите, вы можете преобразовать это число в два числа от 0 до 255 следующим образом:

var leftByte = mynumber>>>8;
var rightByte = mynumber&255;
3
ответ дан 27 November 2019 в 20:00
поделиться

Я собираюсь на секунду предположить, что ваша цель - прочитать произвольные байты из строки. Моим первым предложением было бы сделать ваше строковое представление шестнадцатеричным представлением двоичных данных.

Вы можете читать значения, используя преобразование в числа из шестнадцатеричного:

var BITS_PER_BYTE = 8;

function readBytes(hexString, numBytes) {
    return Number( parseInt( hexString.substr(0, numBytes * (BITS_PER_BYTE/4) ),16 ) );
}

function removeBytes(hexString, numBytes) {
    return hexString.substr( numBytes * (BITS_PER_BYTE/BITS_PER_CHAR) );
}

Затем функции можно использовать для чтения того, что вы хотите:

var hex = '4ef2c3382fd';
alert( 'We had: ' + hex );

var intVal = readBytes(hex,2);
alert( 'Two bytes: ' + intVal.toString(2) );

hex = removeBytes(hex,2);
alert( 'Now we have: ' + hex );

Вы можете интерпретировать байтовую строку как хотите.

Надеюсь, это поможет! Ура!

2
ответ дан 27 November 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: