Страница 1 из 1

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

Добавлено: 2011-12-10 0:36:21
Shad!
Всем привет.
Есть скрипт, принимающий данные от трекеров, пока данные были в 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 (т.е на стандартный поток ввода), так и не понял можно ли их как то преобразовать в десятичный формат?

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

Добавлено: 2011-12-10 1:01:18
FiL
в шестнадцетеричном? ну тогда где-то так -

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

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

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

Добавлено: 2011-12-10 1:18:32
Shad!
Это на каждый символ, я так понимаю?

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

Добавлено: 2011-12-11 15:08:16
Shad!
не заработало :(
пробовал так:

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

#!/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

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

Добавлено: 2011-12-11 18:19:52
kpp
Покажите пример блока шестнадцатиричных цифр, который нужно преобразовать в десятичные.

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

Добавлено: 2011-12-11 21:15:58
Shad!
Как бы этот блок еще увидеть в оригинальном варианте... Строка выше - то, что отображается в терминале, как увидеть оригинальную строку я не придумал. В символы 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 - тестовые...
Вопрос: можно ли то же самое сделать на баше, т.к перл я не знаю совсем? Или бессмысленно?

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

Добавлено: 2011-12-12 23:10:12
FiL
что-то у вас каша в голове. По крайней мере в плане шестнадцетеричных чисел.

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

Добавлено: 2011-12-13 14:37:45
Shad!
Скорее всего, т.к сталкиваюсь с подобными строками впервые.
В общем вопрос решил, всем спасибо.

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

Добавлено: 2011-12-17 21:08:06
QweЯty
как решил то.