将4个字节转换为32位整数的更优雅的方法

时间:2018-12-04 07:14:30

标签: ruby

我通过执行以下代码将包含四个字节值的数组转换为32位数字:

a = [0, 16, 82, 0]
i = a.map { |e| "%02x" % e }.join.to_i(16)
# => 1069568

它可以按预期工作,但是我想知道是否还有一种更优雅的方式来执行此任务。也许不使用字符串。

2 个答案:

答案 0 :(得分:6)

使用packunpack1

a = [0, 16, 82, 0]

a.pack('C4').unpack1('L>')
#=> 1069568

C4表示8位无符号(4倍),L>表示32位无符号(大端)。

但是,pack返回一个二进制字符串,因此它不是无字符串的。

答案 1 :(得分:5)

如果您有一个字节,那将是原来的结果。如果在右侧添加一个字节,则会使原始结果向左移动两个位置(这意味着乘以0x100或16 ** 2 = 256),然后添加新的字节。您可以重复此次数,直到有字节为止。

a.inject{|acc, byte| acc * 0x100 + byte}
# => 1069568