web-dev-qa-db-fra.com

Python: Lire l'hex du fichier dans la liste?

Existe-t-il un moyen simple, en Python, de lire les données hexadécimales d'un fichier dans une liste, par exemple, hex?

Donc hex serait ceci:

hex = ['AA','CD','FF','0F']

Je ne veux pas avoir à lire dans une chaîne, puis diviser. Cela nécessite beaucoup de mémoire pour les gros fichiers.

7
Joseph A.
s = "Hello"
hex_list = ["{:02x}".format(ord(c)) for c in s]

Sortie

['48', '65', '6c', '6c', '6f']

Il suffit de changer s pour open(filename).read() et vous devriez être bon. 

with open('/path/to/some/file', 'r') as fp:
    hex_list = ["{:02x}".format(ord(c)) for c in fp.read()]

Ou, si vous ne souhaitez pas conserver la liste complète en mémoire en une fois pour les fichiers volumineux. 

hex_list = ("{:02x}".format(ord(c)) for c in fp.read())

et pour obtenir les valeurs, continuez à appeler 

next(hex_list)

pour obtenir toutes les valeurs restantes du générateur

list(hex_list)
9
cricket_007

Avec Python 3, supposons que le fichier d’entrée contienne les exemples d’octets que vous montrez. Par exemple, nous pouvons le créer comme ceci

>>> inp = bytes((170,12*16+13,255,15)) # i.e. b'\xaa\xcd\xff\x0f'
>>> with open(filename,'wb') as f:
...     f.write(inp)

Maintenant, étant donné que nous voulons la représentation hexadécimale de chaque octet dans le fichier d'entrée, il serait agréable d'ouvrir le fichier en mode binaire sans essayer d'interpréter son contenu en tant que caractères/chaînes (sinon nous risquons de trébucher sur l'erreur UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 0: invalid start byte).

>>> with open(filename,'rb') as f:
...     buff = f.read() # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format(b) for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']

Si le fichier est volumineux, il peut être utile de lire un caractère à la fois ou par morceaux. Pour cela, je vous recommande de lire ce Q & R

3
Pynchia

Sachez que pour afficher les vidages hexadécimaux de fichiers, des utilitaires sont disponibles sur la plupart des systèmes d'exploitation. Si tout ce que vous voulez faire est de vider le fichier au format hexadécimal, envisagez l’un des programmes suivants:

  • od (vidage octal, qui a une option -x ou -t x)
  • hexdump
  • __ utilitaire xd disponible sous Windows
  • Outils de vidage hexadécimal en ligne, tels que celui-ci
1
aghast