Comment lire des données binaires en Python ?

PHPz
Libérer: 2023-05-08 18:58:06
avant
2078 Les gens l'ont consulté

bytes

bytes : Un type de séquence de caractères. En comparant dir(str) et dir(bytes), nous pouvons voir que les propriétés et méthodes des deux sont très similaires, avec seulement quelques différences. Par conséquent, les octets peuvent également avoir diverses méthodes de fonctionnement sur des séquences d'octets telles que des chaînes, telles que la recherche (trouver), la longueur (len), la coupe (diviser), le découpage, etc.

bytes L'avantage est : méthode intégrée Python, aucune installation supplémentaire de modules tiers n'est requise.

Mais l'inconvénient est également évident : il ne peut interroger qu'une seule requête et ne peut pas interroger plusieurs résultats requis à la fois.

Ouvrez d'abord le fichier via le mode d'ouverture rb et lisez le contenu sous forme d'octets. Il existe une méthode find() pour rechercher une chaîne spécifique, mais cette méthode ne peut trouver que le premier index de chaîne qui répond aux exigences, et elle ne donne pas un index sur un seul bit, mais un index sur un octet de 8 bits. Lorsque vous devez rechercher plusieurs chaînes correspondantes, il n’existe pas de méthode findall() intégrée. Si vous souhaitez en interroger plusieurs, le processus sera gênant. Recherchez d'abord le premier index correspondant 1, commencez par cet index 1, interrogez le deuxième index correspondant 2, et ainsi de suite jusqu'à la fin de la requête.

with open(path, 'rb') as f:
    datas = f.read()
    start_char = datas.find(b'Start')
    # start_char2 = datas.find(b'Start', start_char)
    end_char = datas.find(b'End', start_char)
    # end_char2 = datas.find(b'End', start_char2)
    data = datas[start_char:end_char]
    print(data)
Copier après la connexion

Notez que dans le code ci-dessus, start_char et end_char apparaîtront plusieurs fois, et les heures ne sont pas forcément les mêmes. Il est nécessaire d'obtenir le contenu entre les deux index, mais cela ne peut l'être ni l'un ni l'autre. bouclé ni recherché à la fois. La ligne de code commentée doit être exécutée plusieurs fois pour obtenir l'index des mots-clés. Puisque nous ne savons pas combien d'indicateurs de démarrage il y aura dans les données du fichier, nous ne savons pas combien de fois il sera exécuté. Cela devrait être résolu par une boucle, mais il ne semble pas y avoir de variable pour la boucle. Cela rend le problème plus complexe.

Deuxièmement, puisque le contenu entre les deux signes est obtenu, le processus ci-dessus doit être effectué deux fois. Le processus est donc encore plus compliqué.

Il est donc absolument nécessaire de trouver de nouvelles méthodes.

bitstring

bitstring est un package tiers qui lit les fichiers binaires sous forme de flux d'octets.

bitstring.py La première phrase du fichier est : Ce package définit des classes qui simplifient la création, la manipulation et l'interprétation des données au niveau bit.

La traduction est la suivante : Ce package définit les classes qui simplifient la création, la manipulation et l'interprétation bit par bit des données.

La compréhension simple est d'exploiter directement les données de type octets.

comporte quatre catégories principales, comme suit :

Bits -- Un conteneur immuable pour les données binaires.
BitArray -- Un conteneur mutable pour les données binaires. data.
ConstBitStream -- Un conteneur immuable avec des méthodes de streaming.
BitStream -- Un conteneur mutable avec des méthodes de streaming immuables pour les données binaires.

BitArray -- Conteneur mutable de données binaires.
ConstBitStream -- Conteneur immuable avec des méthodes de flux.
BitStream -- Conteneur mutable avec méthodes de flux.



Comme les octets, lisez d'abord le contenu du fichier, recherchez l'index du mot-clé et découpez pour obtenir le contenu des données.

# update at 2022/05/06 start
# from bistring import ConstBitStream, BitStream
from bitstring import ConstBitStream, BitStream
# update at 2022/05/06 end

hex_datas = ConstBitStream(filename=path)  # 读取文件内容
start_char = b'Start'
start_chars = hex_datas.findall(start_char, bytealigned=True)  # 一次找到全部符合的,返回一个生成器
start_indexs = []
for start_char in start_chars:
    start_indexs.append(start_char)

end_char = b'End'
end_indexs = []
for start_index in start_indexs:
    end_chars = hex_datas.find(end_char, start=start_index, bytealigned=True)  # 找到第一个符合的,返回元组
    for end_char in end_chars:
        end_indexs.append(end_char)

result = []
for i in range(min(len(start_indexs), len(end_indexs))):
    hex_data = hex_datas[start_indexs[i]:end_indexs[i]]
    str_data = BitStream.tobytes(hex_data).decode('utf-8')
    result.append(str_data)
Copier après la connexion
Analyse du code, importez d'abord les deux classes requises : ConstBitStream, BitStream. Pour obtenir le contenu du fichier, findall() trouve tous les index de chaîne correspondants et find() trouve le premier index de chaîne correspondant. Prenez la plus petite valeur des deux listes de début et de fin, et slice pour obtenir les données. Le type est "bitstring.ConstBitStream". La méthode BitStream.tobytes() la convertit en caractères chinois qui seront tronqués, donc utilisez-la. decode() pour décoder et obtenir la chaîne requise.

L'ensemble du processus est toujours simple et continu. Les méthodes findall(), find() et tobytes() sont utilisées dans le code. De plus, il y a de nombreux petits détails auxquels il faut prêter attention. Par exemple, si start_indexs est vide, le code suivant ne doit pas être exécuté, et il en va de même pour end_indexs s'il est vide.

On constate que le package bitstring est relativement simple à utiliser. Selon les besoins, les méthodes utilisées sont relativement peu nombreuses. En fait, il existe de nombreuses autres méthodes, à choisir selon les besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal