# Array conversion

**URL:** <https://www.ruby-forum.com/t/array-conversion/188703>\
**Category:** Ruby\
**Created:** [May 16, 2010, 11:58pm UTC](https://www.ruby-forum.com/t/array-conversion/188703 "2010-05-16T23:58:01Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [May 16, 2010, 11:58pm UTC](https://www.ruby-forum.com/t/array-conversion/188703/1 "2010-05-16T23:58:01Z")

</div>

Hi,

I have a array of 32 bits digests such as this one:

array = [1717922406, 543519338, 543585641, 1701343776, 1718969704,  
544368245, 1751457906, 1713399157]

And I would like to convert it into another array of 128 bits digests.

According so test, I think the such array is:  
[136107835579490162288229994478942319136,  
136190811075650685875822190301307495797]

Do you know if there is a simple way to do a such array conversion.

Thank you all.

Regards

---

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [May 17, 2010, 12:13am UTC](https://www.ruby-forum.com/t/array-conversion/188703/2 "2010-05-17T00:13:26Z")

</div>

On 16.05.2010 23:58, Paul A. wrote:

> Do you know if there is a simple way to do a such array conversion.

Group the array into slices of 4 and then “concatenate” each slice  
by shifting and adding:

array.each\_slice(4).map do |slice|  
slice.inject(0) do |sum,ele|  
(sum\<\<32) + ele  
end  
end  
#=\> [136107835579490162288229994478942319136,  
136190811075650685875822190301307495797]

---

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [May 17, 2010, 12:21am UTC](https://www.ruby-forum.com/t/array-conversion/188703/3 "2010-05-17T00:21:23Z")

</div>

Sebastian H. wrote:

> On 16.05.2010 23:58, Paul A. wrote:
> 
> > Do you know if there is a simple way to do a such array conversion.
> 
> Group the array into slices of 4 and then “concatenate” each slice  
> by shifting and adding:

Awesome! Many thanks, Sebastian!

---

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [May 17, 2010, 12:49am UTC](https://www.ruby-forum.com/t/array-conversion/188703/4 "2010-05-17T00:49:59Z")

</div>

Just a last question: how can we do the oposite operation?

---

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [May 17, 2010, 1:30am UTC](https://www.ruby-forum.com/t/array-conversion/188703/5 "2010-05-17T01:30:45Z")

</div>

Hi,  
On 17 May 2010 00:51, Paul A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Just a last question: how can we do the oposite operation?

I suppose this is a way:

array\_32bit = [1717922406, 543519338, 543585641, 1701343776,  
1718969704, 544368245, 1751457906, 1713399157]  
array\_128bit = [136107835579490162288229994478942319136,  
136190811075650685875822190301307495797]

class Array  
def convert\_digest(from\_bits, to\_bits)  
if from\_bits \< to\_bits  
self.each\_slice(to\_bits/from\_bits).map do |slice|  
slice.inject(0) do |sum,hash|  
(sum\<\<from\_bits) + hash  
end  
end  
else  
self.inject([]) { |result, hash|  
result + (from\_bits/to\_bits).times.inject([]) { |ary|  
hash, rest = hash.divmod(2\*\*to\_bits)  
ary \<\< rest  
}.reverse  
}  
end  
end  
end

p array\_32bit.convert\_digest(32,128) == array\_128bit  
p array\_128bit.convert\_digest(128,32) == array\_32bit  
p array\_32bit.convert\_digest(32,128).convert\_digest(128,32) ==  
array\_32bit  
p array\_128bit.convert\_digest(128,32).convert\_digest(32,128) ==  
array\_128bit

(always be careful with Integer#\<\<(n), as it can easily ‘steal’ all  
your memory if you are a bit heavy on the n 😉 )

Regards,  
B.D.
