|
Функция парсинга строки в массив байт.
Понадобилась мне такая функция, но в гугле я её не нашел. С помощью x-yuri мне удалось это сделать:
function parseStrToBuffer (string) { var result = [], index = 0, length = string.length, code; for (; index < length; index++) { code = string.charCodeAt(index); if (code <= 0x7f) { result.push(code); } else if (code <= 0x7ff) { result.push(code >>> 6 | 0xc0, code & 0x3f | 0x80); } else if (code <= 0xffff) { result.push(code >>> 12 | 0xe0, code >>> 6 & 0x3f | 0x80, code & 0x3f | 0x80); } else if (code <= 0x1fffff) { result.push(code >>> 18 | 0xf0, code >>> 12 & 0x3f | 0x80, code >>> 6 & 0x3f | 0x80, code & 0x3f | 0x80); } else if (code <= 0x3ffffff) { result.push(code >>> 24 | 0xf8, code >>> 18 & 0x3f | 0x80, code >>> 12 & 0x3f | 0x80, code >>> 6 & 0x3f | 0x80, code & 0x3f | 0x80); } else if (code <= 0x7fffffff) { result.push(code >>> 30 | 0xfc, code >>> 24 & 0x3f | 0x80, code >>> 18 & 0x3f | 0x80, code >>> 12 & 0x3f | 0x80, code >>> 6 & 0x3f | 0x80, code & 0x3f | 0x80); } } return result; } // Test string: ﻰﺠ﷼ﺒ╤Ή // Result: [ 239, 187, 176, 239, 186, 160, 239, 183, 188, 239, 186, 146, 226, 149, 164, 206, 137 ] alert(JSON.stringify(parseStrToBuffer(prompt('Enter string')))); Функция эквивалентна вызову: new Buffer('string', 'utf8'); в NodeJS. Правила кодировки UTF8 брал отсюда. |
Цитата:
|
B~Vladi, можете пояснить логику? Есть строка, разбираете по символам, узнаете код символа, а дальше что? Мне сама формулировка непонятна
Цитата:
|
nerv_,
Код символа это ведь число. Число состоит из байт. В utf8 специальная система кодирования, где один символ разбивается на несколько байт. А получить массив байт, это получить все байты, просто разбить числа на составляющие. В простонародье - создать буфер. |
Nekromancer, спасибо) Просто не понимаю, как после получения числа, отличного от 255 (если байт это от 0 до 255) или от или -128 до 127 (если байт это от -128 до 127) их записать в байты? Сбросить биты по маске? Тогда в чем смыл?
|
Цитата:
|
Число в JavaScript это - doubleword (Двойное слово, 4 байта. Ну или uint32).
Каждый байт получается примерно так: n & 0xFF n >>> 8 // далее повторяются шаги, в идеале 4 раз |
Цитата:
Цитата:
Из этой таблице видно, что коды символов могут лежать в некоторых диапазонах. Допустим, если код символа меньше или равно 0x7ff, то символ кодируется одним байтом. Если больше, то несколькими (максимум 6 байт, последняя строка таблицы). Рассмотрим символ ♫. Его код 9835, или в бинарном представлении 00100110 01101011, т.е. 16 бит. UTF8 кодирует 16-битные числа в трех байтах (см. табличку). Т.е. этот символ весит 3 байта, тогда как латинские буквы 1. Смотрим на табличку: 1110xxxx 10xxxxxx 10xxxxxx Здесь x - это 1 бит числа, которое мы хотим закодировать. Цифры - служебные биты. Т.е. мы берём биты числа и раскладываем по нужным местам в соответствующем порядке: 11100010 10011001 10101011 Жирным выделены биты кода нашего символа. Собственно, этим и занимается ветка if(code <= 0xffff): Цитата:
В итоге, мы получаем 3 байта (3 числа): Первое: 11100010 - это 226 в десятичной системе. Второе: 10011001 - это 153 в десятичной системе. Третье: 10101011 - это 171 в десятичной системе. Собственно, то что мы и наблюдаем в результирующем массиве. |
B~Vladi,
this.push(code >>> 24 | 0xf8, это правильно? |
Цитата:
|
Часовой пояс GMT +3, время: 23:38. |
|