Question

Je dois convertir un tableau d'entiers à un peu endian bitmask en utilisant Ruby. Tous les liens ou des conseils seraient appréciés.

l'exemple dit [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

Cela ne fonctionne pas, mais je suis sur la bonne voie?

Était-ce utile?

La solution

Ne pouvez-vous utiliser arr.pack () ? Il a des options pour l'ordre des octets.

Mise à jour: D'accord, j'ai examiné la documentation que vous avez mentionné et la seule façon que je peux faire le travail exemple est la suivante:

  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)

Mais cela voudrait dire que cela signifierait que les 4205 sont 4 amuse-gueules qui, ensemble, représentent 2 octets? C'est la seule façon que je pouvais faire le premier octet ont la deuxième et la septième bit (lecture little endian).

... Ceci est plus d'une « compréhension des documents » question qu'il fait un problème de rubis.

Donc, la solution de tableau n'est pas celui que vous avez besoin, parce que vous devez définir les bits individuels dans un certain nombre. Ceci est réalisé en utilisant le meilleur (à gauche) décalage de bits << et OU binaire | les résultats ensemble.

Autres conseils

Enfora m'a envoyé une calculatrice que j'examinai écrire une fonction. Espérons que cette explication aidera celui qui est à côté d'essayer cela.

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     |  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top