Pregunta

Necesito convertir una matriz de enteros con un poco de máscara de bits endian usando Ruby. Cualquier enlace o sugerencias serían apreciadas.

el ejemplo 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

Esto no funciona, pero estoy en el camino correcto?

¿Fue útil?

Solución

¿No puedes usar arr.pack () ? Tiene opciones de orden de bytes.

Actualización: Ok He echado un vistazo a la documentación que usted ha mencionado y la única manera de que pueda hacer el trabajo de ejemplo es la siguiente:

  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)

Pero eso significaría eso significaría que el 4205 son 4 mordiscos que en conjunto representan 2 bytes? Esa es la única manera de que pudiera hacer que el primer byte tiene el segundo y el séptimo bit (lectura little endian).

... Esto es más de una 'comprensión de los documentos' cuestión de lo que en un asunto de rubí.

Así que la solución matriz no es el que necesita, porque es necesario para establecer los bits individuales de un número. Esto se logra mejor usando (izquierda) y el desplazamiento de bits << OR'ing | los resultados juntos.

Otros consejos

Enfora me envió una calculadora que examiné a escribir una función. Esperemos que esta explicación le ayudará a todo el que está al lado de probar esto.

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     |  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top