réorganiser l'ordre des octets en hexadécimal chaîne (python)
Je veux construire une petite formateur en python donner moi le numérique
valeurs ancrées dans les lignes de hex chaînes.
C'est une partie centrale de mon formateur et doivent être raisonnables rapide à
format de plus de 100 lignes/sec (chaque ligne sur ~100 caractères).
Le code ci-dessous devrait donner un exemple où je suis actuellement bloqué.
'data_string_in_orig" montre le format d'entrée. Il doit être
d'octets échangés pour chaque mot. Le swap de "data_string_in_orig' à
'data_string_in_swapped est nécessaire. En fin de compte j'ai besoin de la structure
d'accès, comme indiqué. Le résultat attendu est dans le commentaire.
Merci d'avance
Wolfgang R
#!/usr/bin/python
import binascii
import struct
## 'uint32 double'
data_string_in_orig = 'b62e000052e366667a66408d'
data_string_in_swapped = '2eb60000e3526666667a8d40'
print data_string_in_orig
packed_data = binascii.unhexlify(data_string_in_swapped)
s = struct.Struct('<Id')
unpacked_data = s.unpack_from(packed_data, 0)
print 'Unpacked Values:', unpacked_data
## Unpacked Values: (46638, 943.29999999943209)
exit(0)
OriginalL'auteur Wolfgang R. | 2012-10-31
Vous devez vous connecter pour publier un commentaire.
array.arrays
ont un byteswap méthode:La
h
dansarray.array('h', x)
a été choisi parce qu'il racontearray.array
à l'égard des données dansx
comme un tableau de 2 octets de courts-métrages. La chose importante est que chaque élément soit considéré comme étant de 2 octets de long.H
, ce qui signifie 2-byte unsigned short, fonctionne tout aussi bien.array.byteswap
. Doux. Suppose que je vais aller de l'avant et de ne pas poster les encombrants décompresser big-endian / repack little-endian solution, j'ai eu la cuisson...Aller de l'avant et de le poster! Avoir plus d'une façon de résoudre un problème peut être utile.
Merci, c'était parfait et rapide pour moi. Par la voie de 100k lignes dans les 5 secondes.
si cette solution a fonctionné pour vous, vous devez accepter la réponse.
Désolé, publié la première fois
OriginalL'auteur unutbu
Cela devrait faire exactement ce que unutbu version, mais peut-être un peu plus facile à suivre pour certains...
Fondamentalement, déballage de 6 courts métrages big-endian, repack 6 short little-endian.
Encore une fois, même chose que unutbu du code, et vous devriez utiliser son.
modifier Viens de réaliser que j'arrive à utiliser mon préféré Python idiome pour ce... a Ne pas faire:
OriginalL'auteur Triptych
C'est un 32 bits unsigned short de swap que j'ai réalisé avec le code sensiblement le même que "unutbu réponse juste un peu plus facile à comprendre. Et techniquement binascii n'est pas nécessaire pour le swap. Seul tableau.byteswap est nécessaire.
OriginalL'auteur Death_Dealer
Le swap de "data_string_in_orig' à 'data_string_in_swapped' peut aussi être fait avec des inclusions sans l'aide des importations:
La compréhension des œuvres pour la permutation de l'ordre des octets en hexadécimal, les chaînes représentant des mots de 16 bits. Modifié par un autre mot de longueur, est trivial. Nous pouvons faire une générale chiffre hexadécimal afin de swap fonction:
L'entrée params sont:
d : l'entrée de chaîne hexadécimale de
wsz: le mot-taille en unités (e.g pour les mots de 16 bits wsz=4, 32-bit des mots wsz=8)
gsz: le nombre d'unités qui restent ensemble e.g pour la réorganisation des octets gsz=2, pour la réorganisation des mots de 16 bits gsz = 4)
OriginalL'auteur Ibtsam Haq