Функция парсинга строки в массив байт.
Понадобилась мне такая функция, но в гугле я её не нашел. С помощью 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, это правильно? |
Цитата:
|
Цитата:
Цитата:
это все работа так влияет) Когда сидишь с кем-то в одном помещении, и у этого "кого-то" весь день рот не закрывается :-E |
Цитата:
|
Цитата:
|
Цитата:
|
dmitriymar,
вы о чём? Запаковать 2 байта в один в принципе нельзя, это как 2 + 2 = 10. |
Фу,гоню хотел написать что возможно текст,но 4 бита не обеспечат все буквы алфавита даж в нижнем регистре любого из языков всего 16 букв можно передать ими.
Но опять,можно уплотнить слегка-вопрос стоит ли того? В 5 бит можно упаковать нижний регистр русского или англ. алфавита. Итого, в 5 байт-можем упаковать 8 букв. компрессия практически в 2 раза. В 6 бит с указанием регистра-20% ,что совсем не мало для крупных-трафик на 20% уменьшить -ощутимо в сравнении -расходы на разработку/экономия трафа-и очень ощутимо А в 7 бит можно запаковать и регистр и 2 языка.-экономия с утф8 в два раза при использовании только русского и меньше при совместном использовании русского и англ. 8 бит можем использовать для указания что это число ,конечно здесь можем использовать числа от 0 до 127. но ничего не мешает разбивать крупные числа на более мелкие. Итого, имеем в итоге экономию около 50% трафа-совсем не мало. Цитата:
но это только для узких задач-допустим все данные это числа от 0 до 15. Каждое из них в представлении обычном представляет один байт,но их возможно упаковать в один байт а затем распарсить. Так что говорить что невозможно-не стоит. Возможно, если задача позволяет. Да и опять,если применить чуть более сложную систему,то можно запаковать с компрессией более чем в два раза в общем-так что в принципе можно говорить что возможно иметь на входе н байт -на выходе н/2 и соответственно в обратную сторону.Условия задачи выполнены -значит задача успешно решена) |
Цитата:
http://otvety.google.ru/otvety/threa...295b834537ed63 |
Цитата:
Цитата:
|
Цитата:
Вышло ведь всё из утверждения,что при работе с языками необходимо 2 байта для одного символа -достаточно одного для полноценной работы с русским ,англ знаками пунктуации и цифрами одновременно. |
Цитата:
http://ru.wikipedia.org/wiki/%D0%A2%...B8%D0%BA%D0%B0 |
dmitriymar,
Несколько это - некоторое количество. Я прекрасно понимаю, что в utf8 для передачи кода символа может быть достаточно и одного байта. Это как бы логично, что код этого знака умещается. Но я не понимаю к чему вы вообще ведёте. |
Цитата:
|
Цитата:
Цитата:
90% -возможно объединить 10%-невозможно. так возможно? если 9 к 1 ?:) |
dmitriymar,
Невозможно. У вас есть чёткое определение - упаковать 2 байта в один. Это означает сохранить значения 16ти битов в 8ми. А с твои подходом я и 8 байт с один определённым битом упакую в байт. Только где мне ещё хранить данные, что мне пришлось упаковать именно так и сколько определённых битов было. В общем вопрос задаётся естественно в общем виде. |
Цитата:
И из области философии -если существует вероятность что это возможно(а это возможно примеры, я привёл)-то утверждение что это невозможно вообще-как раз является неправильным. И соответственно, человека ответившего что это невозможно в принципе не при каких условиях-нужно забраковывать. Мотивация простая-не думает,мыслит шаблонно,говорит то что хотят от него услышать и прочее... В нашей жизни нет чёткого чёрного или белого чтоб мыслить шаблонами. А если мыслить так,то архиваторов в природе не должно быть,но вы ими ведь пользуетесь? |
dmitriymar,
Когда дадут частный пример на собеседовании, тогда и будешь фантазировать и думать как решить. Я считаю, что всегда на собеседовании нужно уточнять, что имеется введу, когда вопрос не однозначный. На счёт философии, увы, не готов обсуждать это. |
dmitriymar,
вы почему-то в моей формулировке вместо фразы "два байта" видите слово "символ", хотя там однозначно написано два байта без указания, что в этих байтах хранится. |
Цитата:
|
Kolyaj,
возможно не правильно вас понял,но и вы не уточняете вопрос общий или применителен к веб. а учитывая что вы веб разработчик контекст я бы определил относительно веб,а для веб ответ однозначен-возможно в большинстве случаев Абстрактный пример,контора занимается уменьшением трафа передаваемой информации по сети. Собеседование: Возможно? НЕТ. А если подумать? НЕТ. До свидания.Вы не подходите |
dmitriymar,
Этот вопрос как раз однозначный. Байт в вебе ничем не отличается. Особенно в наши дни, речь легко может идти о графике или о ячейки памяти. Так что байт в первую очередь это байт, ну как бы логично. |
Цитата:
можно ли сократить количество байт хранящих информацию(запаковка/распаковка) без изменения количества информации -да.архиваторы явный пример. в вопросе была фраза упаковка распаковка. Пример документ вёрд- упакованный/распакованный -разница более чем в два раза если речь не идёт о 2х конкретных байтах,да и то нужно смотреть возможно или нет если каждый из байт содержит число до 127-то возможно если любой число от 128 до 255-то не возможно дай однозначный ответ исходя из этого-возможно или нет? |
dmitriymar,
Ну вот и вы дошли до упоминания бит. А если у меня занято уже 9 бит из 16ти, то видимо нельзя запаковать, да? Вообще, что бы упаковать, именно упаковывать как в ахриваторе, нужен специальный алгоритм, который будет всё разбирать и собирать по определённым правилам. В итоге этот аглоритм каждый раз работает не с 2мя байтами, а он ищет во всех входных данных возможность сократить количество используемых байт по средствам замены бит. В нашем же случае упаковать в байт можно только те самые, заветные 8 бит, ну то есть собственно 1 байт. Было бы у нас в распоряжении хотя 100 байт, можно было бы тогда говорить о каком то алгоритме сжатия. Отвечая на последний ваш вопрос: 2 байта однозначно упаковать в один невозможно. Возможно упаковать 8 любых бит их этих байт 2х байт. Так как по определению - байт, это 8 произвольных бит, состоящих из единиц и нулей, то в один байт можно упаковать только один байт. Так доказываются теоремы в математике. |
Цитата:
Тем более веб,когда мы знаем что придёт на наш запрос и как работать с этой информацией,Сами задаём форматы,правила.Там где возможны варианты ,однозначности быть не может. Точнее,однозначно будет то,что если правильно задали параметры для задачи и решение согласно этим параметрам-то однозначно получим правильный результат и однозначно будет выигрыш в чём то(зависит не велосипед ли изобретаем,ну и от степени сумашествия гения):) |
Всем привет) Немного почитал тему, и увидел, что речь в ней идет об архиваторах. Как именно работают их алгоритмы мне не известно, но согласно этой статье LZMA и этому разъяснению Метод сжатия с использованием словаря.
Иными словами, это Цитата:
Еще можно вспомнить про хеширование, но оно не позволит решить вышеупомянутую задачу. |
Архиваторы умеют архивировать только какое-то подмножество данных. Для любого архиватора можно найти последовательность произвольной длины, которую он не сможет сжать. Т.е. в общем случае сжать два байта в один нельзя. Частное решение именно для двух байт можно было бы послушать, я пока не вижу. Три упаковать в два легче.
|
Цитата:
речь идёт о вебе,где можно создать изначально структуру и изначально знать что в ней без доп байт,что в большинстве случаев реализуемо и в этом случае можем получить вместо 2 х байт 1 и распаковать их назад без последствий.поэтому применительно к веб нет ответа однозначного |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
глянь там ранее. ты когда делаешь аякс запрос и знаешь что придёт текст -ничего не мешает его соответствующе упаковать на сервере и распаковать на клиенте.XHR2 позволяет. вопрос сколько ресов сожрёт Цитата:
конечно,частично повторяет принцип утф8 с латиницей,но в варианте с русским сокращает объём,да и чарсет у страницы остаётся утф-8-что в плюс. |
dmitriymar,
а как распаковать? Кстати можно при желании и в первом лвле, но всё вопрос. |
Часовой пояс GMT +3, время: 14:02. |