# Parse hex ascii

**URL:** <https://www.ruby-forum.com/t/parse-hex-ascii/88443>\
**Category:** Ruby\
**Created:** [March 11, 2007, 3:20am UTC](https://www.ruby-forum.com/t/parse-hex-ascii/88443 "2007-03-11T03:20:14Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![zvilius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/9f8e36/32.png) [@zvilius](https://www.ruby-forum.com/u/zvilius)\
**Post date:** [March 11, 2007, 3:20am UTC](https://www.ruby-forum.com/t/parse-hex-ascii/88443/1 "2007-03-11T03:20:14Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![zvilius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/9f8e36/32.png) [@zvilius](https://www.ruby-forum.com/u/zvilius)\
**Post date:** [March 11, 2007, 3:38am UTC](https://www.ruby-forum.com/t/parse-hex-ascii/88443/2 "2007-03-11T03:38:47Z")

</div>

You could do it like this:

“0164”.scan(/…/).collect {|x| x.hex}

Dan

---

<div class="post-metadata">

**Author:** ![zvilius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/9f8e36/32.png) [@zvilius](https://www.ruby-forum.com/u/zvilius)\
**Post date:** [March 11, 2007, 10:45am UTC](https://www.ruby-forum.com/t/parse-hex-ascii/88443/3 "2007-03-11T10:45:22Z")

</div>

On Sun, Mar 11, 2007 at 11:20:16AM +0900, Mark Z. wrote:

> 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)

Regards,

Brian.

---

<div class="post-metadata">

**Author:** ![zvilius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/9f8e36/32.png) [@zvilius](https://www.ruby-forum.com/u/zvilius)\
**Post date:** [March 11, 2007, 12:10pm UTC](https://www.ruby-forum.com/t/parse-hex-ascii/88443/4 "2007-03-11T12:10:31Z")

</div>

On 11.03.2007 10:44, Brian C. wrote:

> > “64”.hex =\> 100
> 
> [“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
