Вопрос

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

Это не работает, но на правильном ли я пути?

Это было полезно?

Решение

Не могли бы вы использовать обр.пакет()?Он имеет параметры порядка байтов.

Обновлять:Хорошо, я просмотрел упомянутую вами документацию, и единственный способ заставить этот пример работать:

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

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

Таким образом, решение с использованием массива — не то, что вам нужно, поскольку вам нужно установить отдельные биты числа.Это лучше всего достигается с помощью (слева) сдвига BIT << или или 'или | Результаты вместе.

Другие советы

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

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     |  
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top