Domanda

Ho bisogno di convertire un array di interi a una maschera di bit little endian con Ruby. Tutti i collegamenti o suggerimenti sarebbe apprezzato.

L'esempio dice [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

Questo non funziona, ma sono io sulla strada giusta?

È stato utile?

Soluzione

Non puoi utilizzare arr.pack () ? Ha opzioni per l'ordine dei byte.

Aggiornamento: Ok ho preso uno sguardo alla documentazione di lei ha citato e l'unico modo che posso fare il lavoro di esempio è questo:

  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)

Ma ciò significherebbe che significherebbe che il 4205 sono 4 stuzzichini che insieme rappresentano 2 byte? Questo è l'unico modo ho potuto fare il primo byte hanno il secondo e il settimo bit impostato (lettura little endian).

... Questo è più di un problema 'la comprensione dei docs' di quello che esso Un problema di rubino.

Quindi la soluzione array non è quello che vi serve, perché è necessario impostare i singoli bit in un numero. Ciò si ottiene meglio utilizzando (a sinistra) bit di scorrimento << e or'ing | i risultati insieme.

Altri suggerimenti

Enfora mi ha mandato una calcolatrice che ho esaminato scrivere una funzione. Speriamo che questa spiegazione vi aiuterà chi si trova accanto a provare questo.

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     |  
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top