Люди пишут регулярные выражения потому что большинство разработчиков как, так решите простую проблему самым "прохладным" en "эффективным" способом (что означает, что это должно быть максимально нечитабельно).
В Java, существуют библиотеки, чтобы проверить, представляет ли Строка адрес электронной почты без Вас имеющий необходимость знать что-нибудь о регулярных выражениях. Эти библиотеки должны быть доступны для других языков aswel.
Как Jamie Zawinski сказал в 1997: "Некоторые люди, когда столкнуто с проблемой, думают, что "Я знаю, я буду использовать регулярные выражения". Теперь у них есть две проблемы".
Я считаю, что это можно сделать с помощью относительно простых битовых операций:
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"
Как вы вообще поместили двоичные данные в строку? Как двоичные данные кодируются в строку, является ВАЖНЫМ соображением, и вам нужен ответ на этот вопрос, прежде чем вы сможете продолжить.
Один из известных мне способов получить двоичные данные в строке - это использовать объект XHR, и установите для него ожидание UTF-16.
Как только он находится в UTF-16, вы можете получить 16-битные числа из строки, используя «....». CharCodeAt (0)
, который будет числом от 0 до 65535
Затем, если хотите, вы можете преобразовать это число в два числа от 0 до 255 следующим образом:
var leftByte = mynumber>>>8;
var rightByte = mynumber&255;
Я собираюсь на секунду предположить, что ваша цель - прочитать произвольные байты из строки. Моим первым предложением было бы сделать ваше строковое представление шестнадцатеричным представлением двоичных данных.
Вы можете читать значения, используя преобразование в числа из шестнадцатеричного:
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 );
Вы можете интерпретировать байтовую строку как хотите.
Надеюсь, это поможет! Ура!
Ответ Боргара кажется правильным.
Просто хотел прояснить один момент. 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"