Разбор hex строки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- проходил мимо
- Сообщения: 5
- Зарегистрирован: 2011-12-10 0:20:28
Разбор hex строки
Всем привет.
Есть скрипт, принимающий данные от трекеров, пока данные были в ASCII - все прекрасно работало через read line, теперь появилась другая модель и приходящие данные имеют следующий формат: $$<L (2 bytes)><ID (7 bytes)><command (2 bytes)><Data><checksum (2 bytes)>\r\n, где:
$$ - заголовок сообщения
L - длина сообщения (два байта в шестнадцатеричном виде)
ID - идентификатор (в шестнадцатеричном виде) 7 байт, каждая тетрада соответствует одной цифре.
Максимальный ID - 14 цифр, если цифр меньше, то заполняется символом F (пример: 012345678FFFFF - соответствует ID=012345678)
С полем Data проблем нет (там ASCII), а вот поля L и ID в шестнадцатеричном виде. Данные приходят по tcp через inetd (т.е на стандартный поток ввода), так и не понял можно ли их как то преобразовать в десятичный формат?
Есть скрипт, принимающий данные от трекеров, пока данные были в ASCII - все прекрасно работало через read line, теперь появилась другая модель и приходящие данные имеют следующий формат: $$<L (2 bytes)><ID (7 bytes)><command (2 bytes)><Data><checksum (2 bytes)>\r\n, где:
$$ - заголовок сообщения
L - длина сообщения (два байта в шестнадцатеричном виде)
ID - идентификатор (в шестнадцатеричном виде) 7 байт, каждая тетрада соответствует одной цифре.
Максимальный ID - 14 цифр, если цифр меньше, то заполняется символом F (пример: 012345678FFFFF - соответствует ID=012345678)
С полем Data проблем нет (там ASCII), а вот поля L и ID в шестнадцатеричном виде. Данные приходят по tcp через inetd (т.е на стандартный поток ввода), так и не понял можно ли их как то преобразовать в десятичный формат?
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
-
- ст. лейтенант
- Сообщения: 1374
- Зарегистрирован: 2010-02-05 0:21:40
Re: Разбор hex строки
в шестнадцетеричном? ну тогда где-то так -
Код: Выделить всё
#!/bin/bash
read T
T="0x"$T
echo $(($T))
-
- проходил мимо
- Сообщения: 5
- Зарегистрирован: 2011-12-10 0:20:28
Re: Разбор hex строки
Это на каждый символ, я так понимаю?
-
- проходил мимо
- Сообщения: 5
- Зарегистрирован: 2011-12-10 0:20:28
Re: Разбор hex строки
не заработало 
пробовал так:
в файле 0 и $$ от строки, остальная часть в файл не выводится.
сама строка такого вида (в терминал выводится именно так):

пробовал так:
Код: Выделить всё
#!/usr/local/bin/bash
time_last=0
while read line
do
if ([ "${line:0:2}" == "\$\$" ])
then
length=${line:2:2}
length="0x"$length
echo $(($length)) >> /tmp/testtcp
echo "line=$line" >> /tmp/testtcp
else
continue
fi
done
сама строка такого вида (в терминал выводится именно так):
Код: Выделить всё
$$c0??115828.000,A,5556.4268,N,03730.6162,E,0.00,,111211,,,A*7B|10.1|200|0000|0001,0001
-
- лейтенант
- Сообщения: 613
- Зарегистрирован: 2009-08-05 16:10:46
- Откуда: Украина Днепропетровск-Киев
- Контактная информация:
Re: Разбор hex строки
Покажите пример блока шестнадцатиричных цифр, который нужно преобразовать в десятичные.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.
-
- проходил мимо
- Сообщения: 5
- Зарегистрирован: 2011-12-10 0:20:28
Re: Разбор hex строки
Как бы этот блок еще увидеть в оригинальном варианте... Строка выше - то, что отображается в терминале, как увидеть оригинальную строку я не придумал. В символы c0?? превращаются шестнадцатиричные значения (это те самые 11 байт (2+7+2), нулевые байы игнорятся).
Сейчас нашел udp сервер на перле и преобразовал таки строку в нем... Выглядит так:
Все print - тестовые...
Вопрос: можно ли то же самое сделать на баше, т.к перл я не знаю совсем? Или бессмысленно?
Сейчас нашел udp сервер на перле и преобразовал таки строку в нем... Выглядит так:
Код: Выделить всё
#!/usr/bin/perl -w
use strict;
use IO::Socket;
my($sock, $oldmsg, $newmsg, $hisaddr, $hishost, $MAXLEN, $PORTNO, $test, $l);
$MAXLEN = 1024;
$PORTNO = 9877;
$sock = IO::Socket::INET->new(LocalPort => $PORTNO, Proto => 'udp')
or die "socket: $@";
print "Awaiting UDP messages on port $PORTNO\n";
$oldmsg = "This is the starting message.";
while ($sock->recv($newmsg, $MAXLEN)) {
my($port, $ipaddr) = sockaddr_in($sock->peername);
$hishost = gethostbyaddr($ipaddr, AF_INET);
print "Client $hishost said $newmsg \n";
$test = substr($newmsg, 4, 10);
print "substr2 = $test \n";
$oldmsg = unpack("H14",$test);
print "hex2 = $oldmsg \n";
$l = length($oldmsg);
print "l = $l \n";
$newmsg = substr($newmsg, 13, -4);
$newmsg = unpack("a100",$newmsg);
print $newmsg."\n";
open F, "+>>/tmp/gps_tmp.txt";
print F $newmsg.",".$oldmsg."\n";
close F;
}
die "recv: $!";
Вопрос: можно ли то же самое сделать на баше, т.к перл я не знаю совсем? Или бессмысленно?
-
- ст. лейтенант
- Сообщения: 1374
- Зарегистрирован: 2010-02-05 0:21:40
Re: Разбор hex строки
что-то у вас каша в голове. По крайней мере в плане шестнадцетеричных чисел.
-
- проходил мимо
- Сообщения: 5
- Зарегистрирован: 2011-12-10 0:20:28
Re: Разбор hex строки
Скорее всего, т.к сталкиваюсь с подобными строками впервые.
В общем вопрос решил, всем спасибо.
В общем вопрос решил, всем спасибо.
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: Разбор hex строки
как решил то.