Hello,
I've written a little script and it is working. My input is a hexstream. It is constructed as follows:
The problem is that there is a string with variable length (path). The length of the path is the value of the offset-4.
The following script is working.
#!/usr/bin/perl use strict; use warnings; my $mem = ""; my ($section, $load_id, $offset_to_next_load, $load_size, $load_path, +$crc32_load_path); my $hex_data = "54424c004100001300000BAD2F62696E2F7465737432302E64666C +376F6B0F42000013000000042F62696E2F7465737430312E64666C376D6C0F4300001 +3000000042F62696E2F7465737430322E64666C376D6D0F44000013000000042F6269 +6E2F7465737430332E64666C376D6E0F45000013000000042F62696E2F74657374303 +42E64666C376D6F0F46000013000000042F62696E2F7465737430352E64666C376D70 +0F47000013000000042F62696E2F7465737430362E64666C376D710F4800001300000 +0042F62696E2F7465737430372E64666C376D720F49000013000000042F62696E2F74 +65737430382E64666C376D730F4A000013000000042F62696E2F7465737430392E646 +66C376D740F4B000013000000042F62696E2F7465737431302E64666C376E6B0F4C00 +0013000000042F62696E2F7465737431312E64666C376E6C0F4D000013000000042F6 +2696E2F7465737431322E64666C376E6D0F4E000013000000042F62696E2F74657374 +31332E64666C376E6E0F4F000013000000042F62696E2F7465737431342E64666C376 +E6F0F50000013000000042F62696E2F7465737431352E64666C376E700F5100001300 +0000042F62696E2F7465737431362E64666C376E710F52000013000000042F62696E2 +F7465737431372E64666C376E720F53000013000000042F62696E2F7465737431382E +64666C376E730F54000013000000042F62696E2F7465737431392E64666C376E740F5 +5000011000000042F6574632F74657374322E73683B0C08495600000D000000082F47 +7053772E63686B1175D3BB"; # put hex data into memory $mem = pack('H*', $hex_data ); # unpack null terminated section name from memory $section = unpack('Z*', $mem); $mem = substr($mem, length($section) + 1 ); # print section name print $section . ":\n"; for (1 .. length($section) + 1){print "-"} print "\n\n"; # unpack and print load id, offset, size, path (length of path is "off +set - 4") and crc32 of each load entry while (length($mem) > 0) { ($load_id, $offset_to_next_load, $load_size) = unpack('n n N', $me +m); $mem = substr($mem, 8); print "Load ID : " . $load_id . "\n"; print "Offset to next load : " . $offset_to_next_load . "\n"; print "Load Size : " . $load_size . "\n"; ($load_path, $crc32_load_path) = unpack('A' . ($offset_to_next_loa +d-4) . 'N', $mem); $mem = substr($mem, $offset_to_next_load); print "Load Path : " . $load_path . "\n"; print "CRC32 of Load Path : " . $crc32_load_path . "\n"; print "\n\n"; }
It would be very interesting for me if it is possible to read the hex data with one elegant unpack command. I tried it but because of the variable length of the path I did not get a solution. And of course due to the repetitions the following variables would have to be arrays instead of scalars ($load_id, $offset_to_next_load, $load_size). But I think that I could handle this with a map command within the unpack command. My main problem is the variable length of the path.
Thank you for your help.
Dirk
In reply to Better unpack solution available by Dirk80
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |