Maksir
Постоялец
Offline
|
|
« : 27-01-2009 19:06 » |
|
Вот такая строка: +CUSD: 0,"04110430043B0430043D0441003A0020003100300034002E0036003804400020",72 Это данные о балансе, представлены в кодировке UCS-2 iconv переводит всё в такой вид: 呁䌫单㵄ⰱㄪ㈰Ⱓ㔱䄍⭔佚剐㵔വ呁娫呓剁ൔ呁䌫䉐㵓匢≍䄍⭔偃卍 Не знаю, может я делаю что не так... В интернете искал, проги из исходников соберал, применял скрипты всякие, но результат тот же. iconv -l | grep UCS-2 UCS-2\\ UCS-2BE\\ UCS-2LE\\ Вот сам скриптец: #!/bin/bash echo -e "AT+CUSD=1,*100#,15\r\n AT+ZOPERTE=\"mts\"\r\n AT+ZOPRT=5\r\n AT+ZSTART\r\n AT+CPBS=\"SM\"\r\n AT+CPMS=\"SM\",\"SM\",\"\"\r\n">/dev/ttyUSB3 cat /dev/ttyUSB3 | iconv -f UCS-2 -t UTF-8 Встречал какие-то описания, что эти числа, это как бы восмиричное представление данных. Но вот, вопрос, может кто знает, где таблицу найти такую. Копался, не нашёл. Либо это кодировка вообще не та. В некоторых моментах, было сообщение от iconv, что строка заканчивается некоретно... Словно, обрывается она нелогично.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 27-01-2009 19:47 » |
|
http://www.unicode.org/faq/basic_q.html#14Q: What is the difference between UCS-2 and UTF-16?
A: UCS-2 is what a Unicode implementation was up to Unicode 1.1, before surrogate code points and UTF-16 were added as concepts to Version 2.0 of the standard. This term should be now be avoided.
When interpreting what people have meant by "UCS-2" in past usage, it is best thought of as not a data format, but as an indication that an implementation does not interpret any supplementary characters. In particular, for the purposes of data exchange, UCS-2 and UTF-16 are identical formats. Both are 16-bit, and have exactly the same code unit representation.
The effective difference between UCS-2 and UTF-16 lies at a different level, when one is interpreting a sequence code units as code points or as characters. In that case, a UCS-2 implementation would not handle processing like character properties, codepoint boundaries, collation, etc. for supplementary characters.
http://ru.wikipedia.org/wiki/UTF-16Там сказано, то это последовательность 16-битных чисел. IMHO: 04110430043B0430043D0441003A0020003100300034002E0036003804400020 = 0x0411, 0x0430, 0x043B, 0x0430, 0x043D, 0x0441, 0x003A, 0x0020, 0x0031, 0x0030, 0x0034, 0x002E, 0x0036, 0x0038, 0x0440, 0x0020 Что по юникодной странице 0400 переводится как: "Баланс: 104.68р ".
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #2 : 27-01-2009 19:54 » |
|
RXLКак здорово! спасибо!
|
|
|
Записан
|
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #3 : 27-01-2009 21:08 » |
|
RXL нашёл таблицу символов -- http://www.unicode.org/charts/PDF/U0400.pdfно, вот, хотелось бы узнать, есть ли какой-нибудь доступный способ преобразования в нормальный вид? Парсер думаю писать.. но, не изобретать же велосипед...
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #4 : 28-01-2009 04:09 » |
|
Не понятно.... 1. Преобразования чего? 2. Парсер чего?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #5 : 28-01-2009 06:00 » |
|
iconv преобразует в нормальный вид Только вот есть дву вида кодирования UTF-16 и UCS-2 С прямым и обратным порядком байт (LE/BE), для того что бы автоматически определить какой порядок байт, в начале файла или сообщения ставят специальный флаг (0xFF 0xFE) или (0xFE 0xFF) (если не ошибаюсь) в зависимости от того что в начале FF или FE определяют как закодировано остальное сообщение, если нет префикса, то ... (хотя может в стандарте оговорено, я не читал ) iconv при перекодирование кодировании выбрал LE, но если сделать так: то проблема решается
|
|
« Последнее редактирование: 28-01-2009 06:08 от LogRus »
|
Записан
|
Странно всё это....
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #6 : 28-01-2009 08:14 » |
|
RXL да, в общем, не о чем... просто, я имел ввиду собрать вроде граблей, через команды. но, да и так всё ясно: 04110430043B0430043D0441003A0020 00370034002E 0032003804400020 здесь написанно 74.28 LogRus спасибо за ответ. всё понятно. но, чего-то, странным образом не получается. Этот MTC... чтоб ему неладно было, sms присылает в кириллице... #!/bin/bash echo -e "AT+CUSD=1,*100#,15\r">/dev/ttyUSB3 cat /dev/ttyUSB3 | iconv -f UCS-2BE -t UTF-8 iconv ругается, что -- неполный знак... ему сперва нужно очистить от ненужного кода и подсунуть только нужную строку. Но тогда, он всё равно крокозябер пишит. зю. может быть в локали нужно добавить чего...(?) В Ubuntu, например, весь конфиг локали подключен... так, автоматически. когда обновлял, то видел в подробном выводе процесса обновляемых пакетов, установки, настройки, пересборки, ну и команду locale-gen и ... там список подключеных локалий полный
|
|
« Последнее редактирование: 28-01-2009 08:32 от Maksir »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #7 : 28-01-2009 08:24 » |
|
LogRus, как я понимаю, фишка тут в том, что исходные данные представляют из себя ASCII-текст из элементов формата "%04X". Т.е. сперва надо перевести текст в бинарное представление, а уж потом - iconv.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #8 : 28-01-2009 10:33 » |
|
RXL, аааа, ну я для таких целей можно быстренько набросать потоковый конвертер
|
|
|
Записан
|
Странно всё это....
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #9 : 28-01-2009 14:11 » |
|
Подождите, может поделитесь идеями? я даже приблизительно не знаю, как это прикладным способом сделать... так как iconv посылает... для меня это сложно пока. у меня мысль - поделить строку ... каждый элимент массива сопоставить своему юникодному коду... Но, это же бред..
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #10 : 28-01-2009 16:54 » |
|
Maksir, рассказывай
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #11 : 28-01-2009 21:12 » |
|
RXL вот на iconv всё и заканчивается... строку нужную нашёл, но смысл от этого не меняется. я хотел её поделить, да способ забыл... шпору не могу найти. Дык, всё равно теряется смысл.. Вы тут говорили о бинарном представлении... а я не представляю как это делается. #!/bin/bash F="/dev/ttyUSB3" echo -e "AT+CUSD=1,*100#,15\r">$F grep "+CUSD:" $F | iconv -f UCS-2BE -t UTF-8
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #12 : 29-01-2009 05:06 » |
|
Пишем софтинку которая принимает на вход(stdin) строку, на выход(sdtout) hex код
потом ставим её в конвейер перед iconv и вуаля
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
|
|
« Ответ #13 : 29-01-2009 06:55 » |
|
Попробуй так: echo '+CUSD: 0,"04110430043B0430043D0441003A0020003100300034002E0036003804400020",72' | \ perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #14 : 29-01-2009 17:21 » |
|
я перла не знаю поэтому мне проще софтинку написать
|
|
|
Записан
|
Странно всё это....
|
|
|
McZim
|
|
« Ответ #15 : 29-01-2009 20:28 » |
|
LogRus, на пере тоже софтины пишутся
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #16 : 29-01-2009 22:31 » |
|
RXL, Спасибо! уже кое-что есть! Короче, пока вот так: #!/bin/bash F="/dev/ttyUSB3" #echo -e "AT+CUSD=1,*100#,15\r">$F #cat $F > /home/00 #grep "+CUSD:" /home/00 > /home/01 cat /home/01 | \ perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null echo "" Приходится пока поэтапно переключать. Потому что bash подвисает на модеме. Там, постоянный поток, нужно ^C жать, прервывать задачу. Потом править файл на следующую инструкцию. У меня не получается составить условие таким образом, что бы после получения от модема нужной строки, прервать прослушивание порта. Так получается, что cat $F > /home/00 постоянно в цепи с файлом и не прерывает поток. Пробовал прерывать связь с портом (с модемом) , но дело оказалось не в этом. Пробовал разное.. даже не знаю, как вообще задачу прервать... чтоб уже передать данные к строке perl #echo -e "AT+ZSTOP\rAT+ZOPRT=6\r">$F
#esac #exit 0 Вот это из вашего кода, наверное и есть прервать: или, что эта строка значит?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #17 : 29-01-2009 22:34 » |
|
Это значит, что все сообшения об ошибках отправлять в нирвану.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Sla
|
|
« Ответ #18 : 30-01-2009 07:07 » |
|
Maksir, ты ведь не в первый раз видишь *nix like 2>/dev/null - это классика ты же используешь, например ps | grep bla-bla >log stdin < stdout > stdterr 2>
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #19 : 30-01-2009 14:45 » |
|
Sla спасибо. я просто запутался. Вот, классика, там понятно что происходит. Но, в папке /dev , там вроде, как бы, устройства.. не догнал я. но, пока что, это не так важно. теперь начинаю догонять. а, как бы этот поток обойти, - cat $F > /home/00 Например, я создам фильтр, по признаку, мне нужно будет прервать задачу, но не весь сценарий. а у меня не получается... или голова не соображж... никак придумать не могу. На C++, это, наверное было вот так - break и всё... далее следует... А у меня, в bash (вообще ничего не срабатывает) я даже прекратить процесс не могу. Это похоже, как соединение устанавливается с модемом. И сам процесс, сам по-себе пишит в этот файл сколько угодно... до тех пор, пока я не жахну 'ctrl + c' я поищу ещё, как найду решение, выложу здесь. В инете есть подобные скрипты, но мне попадались только те, которые компилировать надо. Код очень мудренный, знать надо... Не один из них у меня не заработал. По этому, в bash удобнее. В нём всё предельно ясно. Если что, отладить можно в любой момент.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #20 : 30-01-2009 15:29 » |
|
навскидку читать перлом поток по частям из $F F="/dev/ttyUSB3"
т.е. весь сценарий написать на перле
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #21 : 30-01-2009 21:12 » |
|
Sla, меня очень заинтересовал уже этот perl Но, вот, долго думал над задачей. Ведь, знал, что можно. Но, я не знаю всего, и всегда пользуюсь шпорами. А тут, случайно удалил то, что было накопленным потенциалом... В общем.. Решил задачку, пока сойдёт и так. Несовсем удачный метод, но, у меня работает. Да, вполне логично, по-сути. Но не идеально пока. Вот: #!/bin/bash F="/dev/ttyUSB3" echo -e "AT+CUSD=1,*100#,15\r">$F head -n 4 $F > /home/00 grep "+CUSD:" /home/00 > /home/01 cat /home/01 | \ perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null echo ""
Может кому понадобится. Спасибо всем! Пойду perl изучать.
|
|
|
Записан
|
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #22 : 30-01-2009 22:11 » |
|
Вот ещё такой вариант; #!/bin/bash F="/dev/ttyUSB3" echo -e "AT+CUSD=1,*100#,15\r">$F head -n 4 $F | \ grep "+CUSD:" | \ perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null echo ""
Всё, теперь точно, - ушёл изучать perl... (меня здесь нет)
|
|
« Последнее редактирование: 31-01-2009 07:31 от Maksir »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #23 : 31-01-2009 05:33 » |
|
Стоит помнить, что устройства TTY - терминалы - работают иначе, чем обычные файлы. По логике они ближе к сокетам. Просто считать все из него (cat /dev/tty...) нельзя, т.к. конца файла нет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
gronqe
Гость
|
|
« Ответ #24 : 25-11-2009 13:20 » |
|
grep "+CUSD:" /home/00 > /home/01 - да уж наворотили я для tele2 делал так: cat /dev/ttyUSB2|grep -m1 CUSD|cut -f2 --delimiter=\" grep -m1 останов после первого совпадения а перекодировать там ничего не нужно слово OCTATOK написано латиницей
|
|
|
Записан
|
|
|
|
|