Little Endian Bitmask - PullRequest
       25

Little Endian Bitmask

3 голосов
/ 12 января 2010

Мне нужно преобразовать массив целых чисел в битовую маску с прямым порядком байтов, используя 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 ]

2 голосов
/ 12 января 2010

Не можете ли вы использовать 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 байта?Это единственный способ заставить первый байт установить второй и седьмой бит (чтение с прямым порядком байтов).

... Это скорее проблема «понимания документов», чем проблема рубина.

Таким образом, решение с массивами - это не то, что вам нужно, потому что вам нужно устанавливать отдельные биты в числе.Это лучше всего достигается с помощью (левого) сдвига битов << и or'ing |результаты вместе. </p>

0 голосов
/ 15 января 2010

Энфора отправила мне калькулятор, который я изучил, чтобы написать функцию. Надеюсь, это объяснение поможет тому, кто будет рядом, попробовать это.

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     |  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...