Beefy Boxes and Bandwidth Generously Provided by pair Networks Bob
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Encode and decode binary-coded decimals

by jmcnamara (Monsignor)
on Oct 08, 2002 at 12:38 UTC ( #203625=snippet: print w/ replies, xml ) Need Help??

Description: Some simple one-liners for encoding and decoding binary-coded decimals (BCD).
    # Encode
    perl -le 'print join " ", map {ord pack "H2", $_} shift =~ /../g' 
+num

    # decode
    perl -le 'print unpack "H*", pack "C*", @ARGV'  num1 num2 ...

    perl -le 'print map {int($_/16).($_%16)} @ARGV' num1 num2 ...


Some examples:

    # Encode

    $ perl -le 'print join " ", map {ord pack "H2", $_} shift =~ /../g
+' 019774
    1 151 116


    # decode

    $ perl -le 'print unpack "H*", pack "C*", @ARGV' 1 151 116
    019774
You can use "h" instead of "H" for low nibble first encoding. Single digit components of the number to be encoded should be zero padded.

--
John.

Comment on Encode and decode binary-coded decimals
Select or Download Code
Re: Encode and decode binary-coded decimals
by jryan (Vicar) on Oct 08, 2002 at 16:59 UTC

    I tried all of your snippets, and none seemed to work. For instance:

    perl -le 'print join " ", map {ord pack "H2", $_} shift =~ /../g' 396

    I'd expect to get: 0011 1001 0110, but instead I get 57, which isn't very binary at all :)

    Similarly with decode:

    perl -le 'print unpack "H*", pack "C*", @ARGV' 0011 1001 0110

    Results in 0be96e (hex!) instead of 396.

    These should work:

    # encode perl -e 'print sprintf("%04b ",$_) for shift =~ /\d/g' decimal #decode perl -e '$p=1; map{$l+=oct("0b$_")*$p;$p*=10} reverse @ARGV; print $l' + bcddigit1 bcddigit2 etc

    Update: Updated decoder to use 5.6.1's oct("0b") feature instead of the old perlfaq way to convery binary to decimal.


      In the first case you need to use 0396 instead of 396. That's what the comment about "zero padding" refers to.
      $ perl -le 'print join " ", map {ord pack "H2", $_} shift =~ /../g +' 0396 3 150

      I'd expect to get: 0011 1001 011

      That is at odds with my expectation.:-) Nevertheless, it isn't too difficult to change these routines to support other ascii, hex or binary representations.

      --
      John.

        My definition of BCD is similar to this, but maybe you are referring to something different? :)

Back to Snippets Section

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (7)
As of 2014-04-16 10:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (422 votes), past polls