Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

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

by bulk88 (Priest)
on May 23, 2013 at 11:17 UTC ( #1034931=note: print w/ replies, xml ) Need Help??


in reply to how to unpack a C struct with length array preceding data array

pack

The / template character allows packing and unpacking of a sequence of items where the packed structure contains a packed item count followed by the packed items themselves. This is useful when the structure you're unpacking has encoded the sizes or repeat counts for some of its fields within the structure itself as separate fields.


Comment on Re: how to unpack a C struct with length array preceding data array
Re^2: how to unpack a C struct with length array preceding data array
by BrowserUk (Pope) on May 23, 2013 at 12:11 UTC

    Problem with that is it only works(*) where the structure has len/data len/data; but the OP has len1/len2 data1/data2.

    (*Barring playing games with relative or absolute positioning per AnomalousMonk ig's reply.)


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      I'm playing games with relative or absolute positioning?!? Have you seen ig's reply? I haven't even begun to understand what's going on there, although to be fair, I haven't really had time yet to study it: I don't know the significance of the  'W' specifier, and the  '@1W@0Wx/x/a' bit looks interesting, and the whole thing is enclosed in a  '(...)' group to which no quantification seems to be applied... Hmmm, interesting...

        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.

        I'm playing games ...

        Sorry to both you & ig for the misattribution.


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (7)
As of 2014-09-17 03:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (57 votes), past polls