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

Люди пишут регулярные выражения потому что большинство разработчиков как, так решите простую проблему самым "прохладным" en "эффективным" способом (что означает, что это должно быть максимально нечитабельно).

В Java, существуют библиотеки, чтобы проверить, представляет ли Строка адрес электронной почты без Вас имеющий необходимость знать что-нибудь о регулярных выражениях. Эти библиотеки должны быть доступны для других языков aswel.

Как Jamie Zawinski сказал в 1997: "Некоторые люди, когда столкнуто с проблемой, думают, что "Я знаю, я буду использовать регулярные выражения". Теперь у них есть две проблемы".

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

4 ответа

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

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
поделиться

Ответ Боргара кажется правильным.

Просто хотел прояснить один момент. Javascript обрабатывает побитовые операции как 32-битные целые числа со знаком, где последний (крайний левый) бит является битом знака. Т.е.,

getIntAt([0x7f,0,0,0],0).toString(16)  //  "7f000000"

getIntAt([0x80,0,0,0],0).toString(16)  // "-80000000"

Однако для обработки октетных данных (например, сетевой поток и т. Д.) Обычно требуется представление 'unsigned int'. Этого можно достичь, добавив оператор '>>> 0' (заполнение нулями, сдвиг вправо), который внутренне сообщает Javascript, что нужно рассматривать это как беззнаковое.

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

getUIntAt([0x80,0,0,0],0).toString(16)   // "80000000"
15
ответ дан 27 November 2019 в 20:00
поделиться
Другие вопросы по тегам:

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