string2hex - q?

kvn

programmer
string2hex - q?

Привет Всем!

Поясните пожалуйста, что означает фраза "Просто закодируй строку в HEX..."
Строка вида :
*5g3*5c3...

Я понимаю, dechex, но как реализовать строку в hex,
возможно это что то типа:
dechex(ord($string))..
Но хотел бы посоветоваться с профи.

т.е. из примерно такого:

*3f3f3f3#c...и т.д.

Должно получиться примерно такое:
0x42, 0x45, 0x47, 0x49, 0x4E, 0x3A,...и т.д.

И потом в итоге такое:
422527494E3A..

Спасибо, за любую инфу по теме.
 

young

Новичок
function asc2bin ($temp) {
$len = strlen($temp);
for ($i=0; $i<$len; $i++) $data.=sprintf("%x",ord(substr($temp,$i,1)));
return $data;
}

А вот с pack у меня не получилось :(
 

kvn

programmer
Еще вопрос, вот нужно то же самое сделать с картинкой, т.е. представить ее в HEX, дык вот трабла она то не в текстовом формате.
$raw_data = join("", file('image.tif'));

а как теперь получить $hex_data,
тупо $hex_data = bin2hex($raw_data) - не получается..:(

хелп.
 

kvn

programmer
т.е. я так понимаю:
PHP:
<?php
$fp = fopen("image.tif", "rb");
while(!feof($fp)) {
   $byte = fgetс($fp);
   $hex .= dechex($byte);
}
так не получаеться. т.е. оно выводит совсем не то.
 

RomikChef

Guest
ЕСТЕСТВЕННО
то же DEChex, а на CHRhex!
сначла надо получать дестятичное значение символа!
ASCII value!
 

kvn

programmer
PHP:
$fp = fopen($this->file, "rb");
        while (!feof($fp)) {
            $byte = fread($fp,1);
            $this->raw_data .= $byte;
            $this->hex_data .= dechex(ord($byte));
        }
        fclose($fp);
        echo $this->hex_data;
че то я туплю, но у меня не сходится...:(
 

RomikChef

Guest
вопрос.
что ты должен получить?
что возвращает dechex?
 

kvn

programmer
все равно.
получаеться картинка:
49492A0086000000380E000000200000047C1F0000007200080E
EE3B80000820000004C63182000800000000C63180001C0073C7
224761020008008A28A203E0020100408BCFBE03E00F8000008A
28220360020000008A28A203E01242100073C72201C000E00000
00000001C00440000100000001C0000000038000000080000000
010000800D000001030001000000480000000101030001000000
0E00000002010300010000000100000003010300010000000100
0000060103000100000001000000110104000100000008000000
1201030001000000010000001501030001000000010000001701
0400010000007E0000001A01050001000000280100001B010500
01000000300100001C0103000100000001000000280103000100
0000020000000000000000000060000000010000006000000001
00


а должно быть:

83128100090EC7F1FFFFFFDFFFFFFB83E0FFFFFF8DFFF7F111C47FF
FF7DFFFFFFB39CE7DFFF7FFFFFFFF39CE7FFFE3FF8C38DDB89EFDF
FF7FF75D75DFC1FFDFEFFBF743041FC1FF07FFFFF75D7DDFC9FFDF
FFFFF75D75DFC1FEDBDEFFF8C38DDFE3FFF1FFFFFFFFFFFFE3FFBBF
FFFEFFFFFFFE3FFFFFFFFC7FFFFFFF7FFFFFFFFEFFFF7F

вообще не похоже.
 

Eugene Bond

sudo rm - rf /
Гхм...

X - the argument is treated as an integer and presented as a hexadecimal number (with uppercase letters).

Значит, надо брать не по-байтно, а по-словно...
 

Eugene Bond

sudo rm - rf /
По идее, слово - 2 байта.
Блин, давно это было :)
Старший и младший, помоему, перепутаны местами...

что-то типа:
PHP:
$lobyte = fread($fp,1); 
$hibyte = fread($fp,1); 
$word = $hibyte*256+$lobyte;
Хех...
 

.des.

Поставил пиво кому надо ;-)
[m]unpack[/m]

PHP:
echo '<pre>';
$sz=filesize('t.gif');
$fp=fopen('t.gif','rb');
$fc=fread($fp,$sz);
$arr=unpack('C'.$sz,$fc);
for($i=1;$i<=$sz;$i++) {
	if($i%16==1) // для красоты вывода
		echo "\n";
	echo str_pad(dechex($arr[$i]),2,'0').' ';
}
echo '</pre>';
 

kvn

programmer
должно быть вот так:

00480E01C7F1FFFFFFDFFFFFFB83E0FFFFFF8DFFF7F111C47FFFF7D
FFFFFFB39CE7DFFF7FFFFFFFF39CE7FFFE3FF8C38DDB89EFDFFF7FF
75D75DFC1FFDFEFFBF743041FC1FF07FFFFF75D7DDFC9FFDFFFFFF
75D75DFC1FEDBDEFFF8C38DDFE3FFF1FFFFFFFFFFFFE3FFBBFFFFEF
FFFFFFE3FFFFFFFFC7FFFFFFF7FFFFFFFFEFFFF7F


а у меня получаеться только вот так:

49492A0086000000380E000000200000047C1F0000007200080E
EE3B80000820000004C63182000800000000C63180001C0073C7
224761020008008A28A203E0020100408BCFBE03E00F8000008A
28220360020000008A28A203E01242100073C72201C000E00000
00000001C00440000100000001C0000000038000000080000000
010000800D000001030001000000480000000101030001000000
0E00000002010300010000000100000003010300010000000100
0000060103000100000001000000110104000100000008000000
1201030001000000010000001501030001000000010000001701
0400010000007E0000001A01050001000000280100001B010500
01000000300100001C0103000100000001000000280103000100
0000020000000000000000000060000000010000006000000001
00

А если сделать
$lobyte = fread($fp,1);
$hibyte = fread($fp,1);
$word = $hibyte*256+$lobyte; // кстати, здесь _точно_ "плюс"!?

то вообще:
0000080000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000
00
 

Eugene Bond

sudo rm - rf /
Во какая фигня в мане нашлась:
PHP:
If you are trying to do ascii <--> binary conversions like me;
you probably found that unlike the perl pack functions, these wont help too much. Attached are two functions I wrote to accomplish this task.

function bin2asc ($binary)
{
 $i = 0;
 while ( strlen($binary) > 3 )
 {
   $byte[$i] = substr($binary, 0, 8);
   $byte[$i] = base_convert($byte[$i], 2, 10);
   $byte[$i] = chr($byte[$i]);
   $binary = substr($binary, 8);
   $ascii = "$ascii$byte[$i]";
 }
 return $ascii;
}

function asc2bin ($ascii)
{
 while ( strlen($ascii) > 0 )
 {
   $byte = ""; $i = 0;
   $byte = substr($ascii, 0, 1);
   while ( $byte != chr($i) ) { $i++; }
   $byte = base_convert($i, 10, 2);
   $byte = str_repeat("0", (8 - strlen($byte)) ) . $byte; # This is an endian (architexture) specific line, you may need to alter it.
   $ascii = substr($ascii, 1);
   $binary = "$binary$byte";
 }
 return $binary;
}

Im not sure these are the most efficient functions, but surely alot faster than loading up a perl interpreter for every binary conversion =)
 

.des.

Поставил пиво кому надо ;-)
мда чего только люди не придумают ;) ведь
pack и unpack именно для этого и придуманы :)
 

kvn

programmer
Ниче не пойму.

Пишу с питоновского скрипта (заведомо рабочего):

у скрипта (python):

ir = ImageReader("/path/to/images/image.tif")
hexdump = ir.GetHex()
print hexdump

получаю:

00480E010000100000000000001F3E2871EE3C1079E03
F3F10FFFFFE28FFF037FF01DFFBFF11BFF833FF019FF3FF
019FF833FF019FF3FF019FF839FF01CFF9FF01CFF81DFE0
0EFFDFE00EFF00FFC107FEFFC007FE007F8283FC7F8003
FC027F0109F83F1011F8241E0014F01E2828F0520C280
8600C1010602000100000000000000

у меня (php):

$fp=fopen($this->file,'rb');
$sz = filesize($this->file);
$fc=fread($fp,$sz);
$this->raw_data = $fc;
$this->hex_data = strtoupper(join("",unpack('h*',$fc)));


9494A20068000000FFFFFEFFFFFFFFFFFF0E1C7DE8113C
FE68F10C0CFE0000107D00F08C00EF024000EE0470CC
00EF06C000EF0670CC00EF06C000EF06706C00EF03600
0EF03702E10FF012010FF01F00F30FE080130FF08F18F7
07D0C8370FF0CF38DF0FE06C7E0EF0ED7EBF1EF0BEFD1
D707AFFDD3F797FFE3EF9FDFFFEFFFFFFFFFFFFFFFD0000
010300010000000840000001010300010000000E00000
002010300010000000100000003010300010000000100
000006010300010000000100000001110400010000000
800000002110300010000000100000005110300010000
000100000007110400010000000E7000000A110500010
00000082100000B11050001000000003100000C11030
001000000010000000821030001000000020000000000
0000000000852000002000000085200000200


куртинка:
http://php4you.kiev.ua/~kvn/7000123.tif

ниче не пойму.
Причем как не крути, но hexdump из ПХП получается почти в 2 раза больше, чем необходимо...
:( как то странно все это...
 

.des.

Поставил пиво кому надо ;-)
Первое. Если открыть любым 16 ричным редактором твою картинку и посмотреть ее представления в hex то получается картина как у следующего скрипта. Твоя ошибка ты используешь h вместо H, а это разные вещи.
PHP:
$arr=unpack('H*hex',$fc);
echo strtoupper($arr['hex']);
Второе. То что делает Питоновский скрипт вообще непонятно, так как получившиеся цифры не имеют ничего общего с hex представлением картинки. Значит ты просто неверно объяснил задачу.
А именно
первые пять байт картинки такие
49 49 2A 00 86
а питоновский скрип показывает
00 48 0E 01 00
Более того картинка занимает 312 байт то есть 16 ричных цифр будет 624.. так что это у питона как раз в два раза меньше. Если бы ты сказал что точно делает этот метод GetHex то можно было бы придумать пхпшный аналог :)
 
Сверху