12
votes

Comment Ruby Manipulez-vous des octets / binaires?

J'essaie d'envoyer une série d'octets binaires sur une prise, pour répondre à une norme particulière utilisée par la société. Personne de mon entreprise n'a utilisé Ruby pour cela avant, mais dans d'autres langues, ils envoient les données d'un octet à la fois (généralement avec une sorte de méthode "pack").

Je ne trouve de toute façon pas créer de binaire à la volée ou créer des octets du tout (le plus proche que je puisse trouver comment vous pouvez transformer une chaîne en octets représentant ses caractères).

Je sais que vous pouvez dire quelque chose comme:

@var = 0B101010101

Mais comment convertiriez-vous une chaîne dans le formulaire "101010101" ou l'entier résultant créé lorsque je fais une chaîne.TO_I (2) dans un binaire réel. Si j'envoie juste la chaîne Accross, une prise, cela n'enverra-t-il que l'ASCII pour "0" et "1" au lieu des caractères littéraux?

Il y a sûrement un moyen de le faire de manière native dans Ruby?


0 commentaires

3 Réponses :


10
votes

Jetez un coup d'œil sur le string.unpack méthode. Ceci est un exemple: xxx

Cela vous donnera des valeurs entières. Il y a plus de moyens de faire la conversion.


2 commentaires

Avant que ce message ait été édité, cela m'a parlé de Array.Pack. Je ne comprends pas bien cela. Si j'ai: @bob = ["111111111", "1000", "1111"] ou quoi que ce soit, puis je dis: @ bob.unpack (B *), il affiche quelque chose comme: "/ 377" est-ce le bon binaire? N'est-ce que le premier élément du tableau? Comment aurais-je besoin de tout le tableau?


Array.Pack est l'opposé de string.unpack. Dans votre exemple, BOB.Pack ('B *') ne fait que conserver un premier élément de matrice. Vous voulez probablement bob.pack ('b b b *'). Cependant, c'est quelque chose de différent de ce que vous demandez dans la question.



15
votes

Je ne sais pas si cela aide suffisamment, mais vous pouvez indexer les bits dans un entier dans Ruby. XXX


0 commentaires

12
votes

Pour faire une chaîne qui a une séquence arbitraire d'octets, faites quelque chose comme ceci:

binary_string = "\xE5\xA5\xBD"


3 commentaires

Pourquoi il y a des "/" dans binary_string?


Il est tout à fait possible pour une chaîne binaire d'avoir un octet avec valeur 0x2f (47). C'est le codage ASCII de "/" donc si vous Inspectez La chaîne Ruby imprimera généralement un "/". La même chose va pour n'importe quel caractère ASCII. Ruby ne sait pas réellement si votre chaîne est une "chaîne binaire", à rubis que votre chaîne est essentiellement une séquence d'octets (sauf 1.9, ils ont ajouté certaines informations de codage).


Merci! ça m'aide beaucoup