Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re^4: how to unpack a C struct with length array preceding data array

by Anonymous Monk
on May 23, 2013 at 15:54 UTC ( #1034967=note: print w/ replies, xml ) Need Help??


in reply to Re^3: how to unpack a C struct with length array preceding data array
in thread how to unpack a C struct with length array preceding data array

ig's reply was quite instructive, I had some trouble understanding it, but it was worth the trouble.

The (..) could be omitted, but since @ is a position "counted from the start of the innermost ()-group", by putting them there you can reuse this template as is in a bigger structure. (see pack)

W is "An unsigned char value " so 'W W' takes the two first chars and adds them to the output list : (5,6). '@0Wx' goes back to the beginning of the structure, reads one byte as a number (5), and skips one. So we're now at the Beginning of "Hello" and the output list should be (5,6,5). '/a' takes the last element in the output list as a length (5), and reads that many characters: we get (5,6,"Hello").

Now for the best part. With '@1W@0Wx' we go back to pos 1, read "\006", go back to 0, read "\005" and skip one. We are at the beginning of "Hello" again, and the ouput list is (5,6,"Hello",6,5). '/x' takes the last value in the output list and skips as many bytes, so we end up just before " World" with ouput list: (5,6,"Hello",6). Another '/a' takes the last value in the output list, and reads a 6 bytes long string. We end up with (5,6,"Hello", " World").

What I learned with this exemple is that the '/' template is not necessarily lenth/type, but that /type pops the last value read, so that you may stack more than one, and then make as many /type readings. And well, that's not too much of a surprise, it was in pack's documentation all along :).

I do agree with ig though, you should avoid that solution if possible, it's hard to read, and it would be difficult to expand it for a string of three parts or more.


Comment on Re^4: how to unpack a C struct with length array preceding data array
Select or Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1034967]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (9)
As of 2015-07-29 09:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (263 votes), past polls