Pergunta

Preciso converter uma variedade de números inteiros em uma pequena fase de bits endiana usando Ruby. Quaisquer links ou dicas seriam apreciados.

O exemplo diz [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

Isso não funciona, mas estou no caminho certo?

Foi útil?

Solução

Você não pode usar Arr.pack ()? Tem opções para ordem de byte.

ATUALIZAÇÃO: OK, dei uma olhada na documentação que você mencionou e a única maneira de fazer o exemplo de trabalho é o seguinte:

  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)

Mas isso significaria que isso significaria que os 4205 são 4 petiscos que juntos representam 2 bytes? Essa é a única maneira de fazer o primeiro byte ter o segundo e o sétimo conjunto (lendo Little Endian).

... Isso é mais uma questão de 'entender a questão dos documentos do que uma questão de rubi.

Portanto, a solução da matriz não é a que você precisa, porque você precisa definir os bits individuais em um número. Isso é melhor alcançado usando (à esquerda) mudança de bit << e or'ing | os resultados juntos.

Outras dicas

A IPFORA me enviou uma calculadora que eu examinei para escrever uma função. Espero que essa explicação ajude quem é o próximo a tentar isso.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top