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
I expected both these operations to return the same output: "abc".
The easiest way to understand why your approach didn't work, is to simply start with what you are expecting:
"abc".unpack("H*")
# => ["616263"]
["616263"].pack("H*")
# => "abc"
So, it seems that Ruby expects your hex bytes in one long string instead of separate elements of an array. So the simplest answer to your original question would be this:
chars = ["61", "62", "63"]
[chars.join].pack("H*")
# => "abc"
This approach also seems to perform comparably well for large input:
require 'benchmark'
chars = ["61", "62", "63"] * 100000
Benchmark.bmbm do |bm|
bm.report("join pack") do [chars.join].pack("H*") end
bm.report("big pack") do chars.pack("H2" * chars.size) end
bm.report("map pack") do chars.map{ |s| [s].pack("H2") }.join end
end
# user system total real
# join pack 0.030000 0.000000 0.030000 ( 0.025558)
# big pack 0.030000 0.000000 0.030000 ( 0.027773)
# map pack 0.230000 0.010000 0.240000 ( 0.241117)