Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re^3: pack/unpack 6-bit fields. (precision)

by BrowserUk (Pope)
on Aug 18, 2004 at 15:20 UTC ( #383992=note: print w/ replies, xml ) Need Help??


in reply to Re^2: pack/unpack 6-bit fields. (precision)
in thread pack/unpack 6 bit fields.

Neat solution...but when using 'B', it produces numbers greater than 6-bits can hold:

P:\test>perl print join'|', unpack "C*", # 16 6-bit numeric values pack "B6"x16, # string of 16 bytes, each holding a 6-bit value unpack "a6"x16, # 16 6-character base-2 strings unpack "B*", # 96-character base-2 string "twelve bytes"; # 12-byte packed string ^Z 116|28|116|148|108|28|100|148|32|24|36|228|116|24|84|204

Switching to 'b' fixes that:

P:\test>perl print join'|', unpack "C*", # 16 6-bit numeric values pack "b6"x16, # string of 16 bytes, each holding a 6-bit value unpack "a6"x16, # 16 6-character base-2 strings unpack "b*", # 96-character base-2 string "twelve bytes"; # 12-byte packed string ^Z 52|29|23|25|44|25|23|25|32|8|22|30|52|21|54|28

Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail
"Memory, processor, disk in that order on the hardware side. Algorithm, algorithm, algorithm on the code side." - tachyon


Comment on Re^3: pack/unpack 6-bit fields. (precision)
Select or Download Code
Re^4: pack/unpack 6-bit fields. (insanity)
by tye (Cardinal) on Aug 18, 2004 at 16:03 UTC

    Thanks. I keep forgetting how broken un/pack are in this respect. Having "B6" load the high six bits (of the low byte of the integer) is just non-sensical.

    So for the most sane configuration (bits split based on base-2 representation not some "ascending bit order" representation) you have to work harder:

    my @fields= unpack "C*", # 16 6-bit numeric values pack "b6"x16, # string of 16 bytes, each holding a 6-bit value map ''.reverse, # 16 6-character ascending-bit strings unpack "a6"x16, # 16 6-character base-2 strings unpack "B*", # 96-character base-2 string "twelve bytes"; # 12-byte packed string print "(@fields)\n"; my $string= pack "B*", # 12-byte packed string pack "a6"x16, # 96-character base-2 string map ''.reverse, # 16 6-character base-2 strings unpack "b6"x16, # 16 6-character ascending-bit strings pack "C*", # string of 16 bytes, each holding a 6-bit value @fields; # 16 6-bit numeric values print "($string)\n";

    outputs:

    (29 7 29 37 27 7 25 37 8 6 9 57 29 6 21 51) (twelve bytes)

    - tye        

          My numbers look correct to me.

          print unpack 'B*', 'twelve bytes'; ## hand spaced 001011 101110 111010 100110 001101 100110 111010 100110 000001 000100 011010 011110 001011 101010 011011 001110

          You show code containing 'B*' but the bits that you show are from using 'b*'. That is why you can match the 'b*' case against it.

          Trying to match the 'B*' against that string gives one of the less-sane results I mentioned (where the bit orders are mismatched).

          To be extra clear, using 'B*' would result in each group of 8 bits being reversed (it doesn't reverse the whole bit string), which results in different 6-bit chunks not just reversed 6-bit chunks (so neither of your cases cover it).

          - tye        

    Log In?
    Username:
    Password:

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

    How do I use this? | Other CB clients
    Other Users?
    Others romping around the Monastery: (5)
    As of 2015-07-05 22:25 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 (68 votes), past polls