From: Robert Klemme Date: 2007-03-11T20:10:07+09:00 Subject: Re: parse hex ascii On 11.03.2007 10:44, Brian Candler wrote: > On Sun, Mar 11, 2007 at 11:20:16AM +0900, Mark Zvilius wrote: >> I want to parse a hex-ascii string into an array of numbers. For >> example: >> >> "0164" => [1,100] >> >> Essentially I need to iterate through character pairs and use >> String#hex: >> >> "01".hex => 1 >> "64".hex => 100 >> >> I can do this easily enough in "C style" with an index into the string, >> i.e. equivalent to a C "for" loop. But I'm interested in solutions that >> are more in the "Ruby style," using an iterator. >> >> Suggestions? > > ["01FF"].pack("H*").each_byte { |b| puts b } > > or: > > ["01FF"].pack("H*").unpack("C*").each { |b| puts b } > > (the second form constructs an explicit array of Fixnums) While Brian's solution is much more elegant, here's another one: irb(main):002:0> i="0164".to_i(16) => 356 irb(main):003:0> a=[] => [] irb(main):004:0> begin; a << (i&0xFF); i/=0x100; end while i>0 => nil irb(main):005:0> a => [100, 1] If you do not actually need the array then String#to_i might actually be faster / easier. But that of course depends on what you want to do with the result. Kind regards robert