Ruby - octets de lecture à partir d'un fichier, convertir en entier
Je suis en train de lire des entiers non signés à partir d'un fichier (stockées en octets consécutifs) et de les convertir en nombres Entiers. J'ai essayé ceci:
file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value will be less than expected
Ce que je fais mal?
OriginalL'auteur | 2009-08-24
Vous devez vous connecter pour publier un commentaire.
Vous ne lisez pas assez d'octets. Comme tu le dis dans le commentaire de tadman réponse, vous obtenez
202
au lieu de3405691582
Avis que les 2 premiers octets de
0xCAFEBABE
est0xCA
=202
Si vous voulez vraiment tous les 8 octets dans un seul numéro, puis vous avez besoin de lire plus que le unsigned short
essayer
Le trait de soulignement est en supposant que le natif de long va être de 8 octets, ce qui certainement n'est pas garanti.
le premier octet est 0xCA, les deux premiers est 0xCAFE
3199925962 = 0xBEBAFECA
, il semble que vous êtes d'avoir un ordre d'octet problème. Pour crossplatformness, j'ai l'habitude de compter sur l'ordre des octets de réseau, plutôt que l'ordre des octets de l'hôte.0xCA = deux 4 bits nybbles = 1 octet de 8 bits, comme rampion points. Obtenir 202 est le même que le fichier.lire[0] cependant, la valeur ASCII du premier caractère, qui pourrait être le problème.
Oups. Oui, j'ai confondu moi-même en comptant les deux premiers caractères hexadécimaux vs deux octets. Mon concept général est correct cependant, maintenant vous avez juste besoin de traiter avec l'ordre des octets.
OriginalL'auteur bobDevil
Comment à propos de la recherche dans La Pioche? (Ruby 1.9, p. 44)
each_byte itère sur un fichier octet par octet.
OriginalL'auteur totochto
Il ya un couple de bibliothèques qui aident à l'analyse des données binaires en Ruby, en vous permettant de déclarer le format de données en un simple haut niveau déclaratif DSL, et puis trouver tous les emballage, de déballage, de bits de se tourner, de modifier et d'endian-conversions par eux-mêmes.
Je n'ai jamais utilisé l'un de ces, mais voici deux exemples. (Il y en a plus, mais je ne connais pas):
OriginalL'auteur Jörg W Mittag
Ok, je l'ai eu à travailler:
Merci pour votre aide.
OriginalL'auteur
Quel format sont les numéros stockés dans le fichier? Est-il en hexadécimal? Votre code est correct pour moi.
OriginalL'auteur tchen
Lorsque vous traitez avec des données binaires, vous devez être sûr que vous êtes de l'ouverture du fichier en mode binaire si vous êtes sur Windows. Cela vaut pour à la fois la lecture et de l'écriture.
Il peut aussi y avoir des problèmes avec les "endian" codage selon la source de la plateforme. Par exemple, les machines ppc, qui comprennent les vieux systèmes Mac, IBM Power serveurs, PS3 clusters, ou des serveurs Sun Sparc.
Pouvez-vous poster un exemple de la façon dont il est "moins"? Habituellement, il y a un modèle évident pour les données.
Par exemple, si vous voulez 0x1234, mais vous obtenez 0x3412 c'est un endian problème.
Aussi, je suis sur Linux, dois-je m'inquiéter au sujet de l'ouverture du fichier en mode binaire?
Il est toujours bon d'utiliser explicitement le mode binaire sur Unix. Il ne fait pas de mal (c'est juste un no-op), mais un.) il rend votre code plus clair et b.) vous permet d'économiser des tonnes de débogage, si jamais quelqu'exécute votre code sur Windows.
OriginalL'auteur tadman