The description of the 'a', 'A' & 'Z' templates for pack reads:
a A string with arbitrary binary data, will be null padded. A A text (ASCII) string, will be space padded. Z A null-terminated (ASCIZ) string, will be null padded.
And sure enough:
print length pack '(A2)*', 'fr','ed','x';; 6 print unpack 'C*', pack '(A2)*', 'fr','ed','x';; 102 114 101 100 120 32 print length pack '(a2)*', 'fr','ed','x';; 6 print unpack 'C*', pack '(a2)*', 'fr','ed','x';; 102 114 101 100 120 0 print length pack '(Z2)*', 'fr','ed','x';; 6 print unpack 'C*', pack '(Z2)*', 'fr','ed','x';; 102 0 101 0 120 0 ## Note! the 'r' & 'd' characters have been thrown +away? Another bug?
And the docs for unpack say:
unpack does the reverse of pack: it takes a string and expands it out into a list of values.
But:
printf "'%s'\n", join"'", unpack '(A2)*', 'fredx';; 'fr'ed'x' printf "'%s'\n", join"'", unpack '(a2)*', 'fredx';; 'fr'ed'x' printf "'%s'\n", join"'", unpack '(Z2)*', 'fredx';; 'fr'ed'x'
Shouldn't that last element from unpack ('x') be padded with either space or null?
Has it always been 'wrong'? Is it too late to change it?
In reply to pack() v unpack() padding: bug or ??? by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |