2009-07-28 16 views
10

Sto provando ad inviare una serie di byte binari attraverso un socket, per soddisfare uno standard particolare che la mia azienda utilizza. Nessuno nella mia azienda ha mai usato Ruby per questo, ma in altre lingue, inviano i dati attraverso un byte alla volta (di solito con una sorta di metodo "pack").Come fa Ruby a gestire i byte/binari?

Non riesco a trovare comunque la possibilità di creare binari al volo, o di creare dei byte (il più vicino lo posso trovare come si può trasformare una stringa in byte che rappresentano i suoi caratteri).

So che si può dire qualcosa di simile:

@var = 0b101010101

Ma come avrei convertire una stringa nella forma "101.010.101" o il numero intero risultante creato quando faccio string.to_i (2) in un vero binario. Se mando semplicemente la stringa su un socket, non manderò semplicemente ASCII per "0" e "1" invece dei caratteri letterali?

Sicuramente c'è qualche modo per farlo in modo nativo in Ruby?

risposta

10

Per effettuare una stringa che ha una sequenza arbitraria di byte, fare qualcosa di simile:

binary_string = "\xE5\xA5\xBD" 

Il "\ x" è una fuga speciale per codificare un byte arbitrario da esadecimale, così " \ xE5 "significa byte 0xE5.

Quindi provare a inviare quella stringa sul socket.

+0

Perché ci sono alcuni "/" in binary_string? – why

+2

È possibile che una stringa binaria abbia un byte con valore 0x2F (47). Questa è la codifica ASCII di "/", quindi se tu "ispeziona" la stringa, Ruby di solito stampa un "/". La stessa cosa vale per qualsiasi carattere ASCII. Ruby in realtà non sa se la tua stringa è una "stringa binaria", per Ruby la tua stringa è fondamentalmente una sequenza di byte (tranne che nella versione 1.9 aggiungono alcune informazioni di codifica). –

+0

Grazie! mi aiuta molto – why

9

Dai un'occhiata al metodo String.unpack. Questo è un esempio:

str = "1010" 
str.unpack("cccc") 
=> [49, 48, 49, 48] 

Ciò fornirà valori interi. Ci sono altri modi per fare la conversione.

+0

Prima che questo post fosse modificato, mi ha parlato di Array.pack. Non capisco questo. Se ho: @bob = ["111111111", "1000", "1111"] o qualsiasi altra cosa, e poi dico: @ bob.unpack (b *), visualizza qualcosa come: "/ 377" È il binario corretto? Non è solo il primo elemento dell'array? Come potrei fare l'intero array? – Jenny

+0

Array.pack è l'opposto di String.unpack. Nel tuo esempio bob.pack ('b *') sta solo comprimendo il primo elemento dell'array. Probabilmente vuoi bob.pack ('b * b * b *'). Tuttavia questo è qualcosa di diverso da ciò che stai chiedendo nella domanda. – kgiannakakis

14

Non so se questo aiuti abbastanza, ma è possibile indicizzare i bit in un intero in ruby.

n = 0b010101 

n # => 21 

n = 21 

n[0] # => 1 
n[1] # => 0 
n[2] # => 1 
n[3] # => 0 
n[4] # => 1 
n[5] # => 0 
Problemi correlati