Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

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

by AnomalousMonk (Abbot)
on May 23, 2013 at 14:03 UTC ( #1034957=note: print w/ replies, xml ) Need Help??


in reply to Re^2: 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

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...


Comment on Re^3: how to unpack a C struct with length array preceding data array
Select or Download Code
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

    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.

Re^4: how to unpack a C struct with length array preceding data array
by BrowserUk (Pope) on May 23, 2013 at 22:18 UTC
    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://1034957]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (10)
As of 2015-07-06 08:33 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 (70 votes), past polls