Frage

Ich brauche eine Reihe von ganzen Zahlen auf eine Little-Endian-Bit-Maske mit Ruby zu konvertieren. Alle Links oder Hinweise würden geschätzt.

Das Beispiel sagt [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

Das funktioniert nicht, aber ich bin auf dem richtigen Weg?

War es hilfreich?

Lösung

Sie können nicht verwenden arr.pack () ? Es verfügt über Optionen für die Byte-Reihenfolge.

Update: Ok Ich habe einen Blick in die Dokumentation aufgenommen Sie erwähnt und die einzige Art, wie ich das Beispiel der Arbeit machen kann, ist dies:

  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)

Aber das würde bedeuten, das würde bedeuten, dass die 4205 sind 4 Knabbereien, die zusammen 2 Bytes darstellen? Das ist die einzige Art, wie ich das erste Byte hat den zweiten machen könnte und siebten Bit-Satz (Little-Endian-Lesen).

... Dies ist eher ein Problem ‚docs zu verstehen‘, als es ihm eine rubin Ausgabe.

So ist die Array-Lösung nicht die ist, die Sie benötigen, weil Sie die einzelnen Bits in einer Reihe einstellen müssen. Dies wird am besten erreicht, indem (links) Bitverschiebung << und ODER-Verknüpfung | die Ergebnisse zusammen.

Andere Tipps

Enfora hat mir einen Rechner, den ich eine Funktion schreiben suchte. Hoffentlich ist diese Erklärung wird dazu beitragen, wer nächste ist, dies zu versuchen.

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     |  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top