Ruby's pack and unpack explained

后端 未结 4 550
长发绾君心
长发绾君心 2021-02-08 04:40

Even after reading the standard documentation, I still can\'t understand how Ruby\'s Array#pack and String#unpack exactly work. Here is the example that\'s causing me the most t

4条回答
  •  梦如初夏
    2021-02-08 05:02

    The 'H' String directive for Array#pack says that array contents should be interpreted as nibbles of hex strings.

    In the first example you've provided:

    irb(main):002:0> chars.pack("H*")
    => "a"
    

    you're telling to pack the first element of the array as if it were a sequence of nibbles (half bytes) of a hex string: 0x61 in this case that corresponds to the 'a' ASCII character.

    In the second example:

    irb(main):003:0> chars.pack("HHH")
    => "```"
    

    you're telling to pack 3 elements of the array as if they were nibbles (the high part in this case): 0x60 corresponds to the '`' ASCII character. The low part or second nibble (0x01) "gets lost" due to missing '2' or '*' modifiers for "aTemplateString".

    What you need is:

    chars.pack('H*' * chars.size)
    

    in order to pack all the nibbles of all the elements of the array as if they were hex strings.

    The case of 'H2' * char.size only works fine if the array elements are representing 1 byte only hex strings.

    It means that something like chars = ["6161", "6262", "6363"] is going to be incomplete:

    2.1.5 :047 > chars = ["6161", "6262", "6363"]
     => ["6161", "6262", "6363"] 
    2.1.5 :048 > chars.pack('H2' * chars.size)
     => "abc" 
    

    while:

    2.1.5 :049 > chars.pack('H*' * chars.size)
     => "aabbcc"
    

提交回复
热议问题