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

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.