Разбор hex строки

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Shad!
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-12-10 0:20:28

Разбор hex строки

Непрочитанное сообщение Shad! » 2011-12-10 0:36:21

Всем привет.
Есть скрипт, принимающий данные от трекеров, пока данные были в 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
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.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/

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Разбор hex строки

Непрочитанное сообщение FiL » 2011-12-10 1:01:18

в шестнадцетеричном? ну тогда где-то так -

Код: Выделить всё

#!/bin/bash
read T
T="0x"$T
echo $(($T))

Shad!
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-12-10 0:20:28

Re: Разбор hex строки

Непрочитанное сообщение Shad! » 2011-12-10 1:18:32

Это на каждый символ, я так понимаю?

Shad!
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-12-10 0:20:28

Re: Разбор hex строки

Непрочитанное сообщение Shad! » 2011-12-11 15:08:16

не заработало :(
пробовал так:

Код: Выделить всё

#!/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
в файле 0 и $$ от строки, остальная часть в файл не выводится.
сама строка такого вида (в терминал выводится именно так):

Код: Выделить всё

$$c0??115828.000,A,5556.4268,N,03730.6162,E,0.00,,111211,,,A*7B|10.1|200|0000|0001,0001

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Разбор hex строки

Непрочитанное сообщение kpp » 2011-12-11 18:19:52

Покажите пример блока шестнадцатиричных цифр, который нужно преобразовать в десятичные.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Shad!
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-12-10 0:20:28

Re: Разбор hex строки

Непрочитанное сообщение Shad! » 2011-12-11 21:15:58

Как бы этот блок еще увидеть в оригинальном варианте... Строка выше - то, что отображается в терминале, как увидеть оригинальную строку я не придумал. В символы c0?? превращаются шестнадцатиричные значения (это те самые 11 байт (2+7+2), нулевые байы игнорятся).
Сейчас нашел 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: $!";
Все print - тестовые...
Вопрос: можно ли то же самое сделать на баше, т.к перл я не знаю совсем? Или бессмысленно?

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Разбор hex строки

Непрочитанное сообщение FiL » 2011-12-12 23:10:12

что-то у вас каша в голове. По крайней мере в плане шестнадцетеричных чисел.

Shad!
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-12-10 0:20:28

Re: Разбор hex строки

Непрочитанное сообщение Shad! » 2011-12-13 14:37:45

Скорее всего, т.к сталкиваюсь с подобными строками впервые.
В общем вопрос решил, всем спасибо.

Аватара пользователя
QweЯty
лейтенант
Сообщения: 796
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: Разбор hex строки

Непрочитанное сообщение QweЯty » 2011-12-17 21:08:06

как решил то.
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение