Little Endian位掩码

时间:2010-01-12 20:44:06

标签: ruby bitmask endianness

我需要使用Ruby将整数数组转换为小端字节掩码。任何链接或提示将不胜感激。

示例说[2,7,9,11] => “4205”

a = [2,7,9,11] # 4205
b = [1,2,3,4] # 0F00
def array_to_mask(arr)
  mask = 0
  arr.each do |i|
    mask = mask | (1 << i)
  end
  return mask.to_s(16)
end
p array_to_mask(a) # a84
p array_to_mask(b) # 1e

这不起作用,但我是在正确的轨道上吗?

2 个答案:

答案 0 :(得分:2)

你不能使用arr.pack()吗?它有字节顺序选项。

更新:好的我已经看了你提到的文档,我可以让这个例子工作的唯一方法是:

  7          2              11   9      (decimal index count)
0 1 0 0  0 0 1 0  0 0 0 0  0 1 0 1      (bits)

   4        2        0        5         (nibbles, in hex)

但这意味着这意味着4205是4个半字节,共同代表2个字节?这是我可以使第一个字节设置第二和第七位(读取小端)的唯一方法。

......这更像是一个'理解文档'的问题,而不是一个红宝石问题。

因此,阵列解决方案不是您需要的解决方案,因为您需要在数字中设置各个位。这最好使用(左)位移&lt;&lt;和oring |结果一起。

答案 1 :(得分:0)

Enfora给我发了一个计算器,我检查过它来写一个函数。希望这个解释能帮助下一个尝试这个的人。

values: [2,7,9,11]
Bits:   | 8 7 6 5 | 4 3 2 1 | 16 15 14 13 | 12 11 10 9 |
Binary: | 0 1 0 0 | 0 0 1 0 | 0  0  0  0  | 0  1  0  1 |
Hex:    |    4    |    2    |      0      |      5     |