Comment un logiciel de compression de données lit un fichier en tant que fichier binaire pur et rend la sortie?

cs.stackexchange https://cs.stackexchange.com/questions/121856

Question

J'ai une technique de compression hybride que je veux mettre en œuvre, ma mise en œuvre est (jusqu'à présent): je peux coder une chaîne dans une chaîne compressée codée.Ce sont des chaînes binaires.Par exemple,

J'ai lu des textes à partir d'un fichier texte ->

puis le convertir en une chaîne binaire ->

puis convertissez-le en une chaîne binaire codée.

À ce stade, je peux enregistrer la chaîne binaire codée dans un fichier texte, mais je veux savoir ce qui est fait en général.

Par exemple, lorsque nous utilisons winrar logiciel, il -

  1. ne lit pas comme je l'ai dit ci-dessus, cela comprime tout fichier
  2. fait fichier .rar comme sortie
  3. Ainsi, comment un compresseur "lue" tout fichier en tant que forme binaire pure et comment il fabrique un fichier de sortie?

    D'une autre manière, ce que je veux savoir, c'est savoir comment lire n'importe quel fichier en tant que forme binaire pure et créer un fichier de sortie étant donné que j'ai un schéma de codage et de décodage. Veuillez commenter tout ce qui concerne la question, je suis nouveau au sujet.

Était-ce utile?

La solution

Un fichier est un flux d'octets

Bien que les OSES fournissent des cloches et des sifflets (tels que les métadonnées, ou Forks ), la plupart définissent un fichier comme une séquence de 0 ou plus octets .

Chaque octet dans le fichier est une valeur numérique de 0 à 255 (inclus). Il n'y a rien de plus à cela.

Un format de fichier est un moyen de donner un sens aux octets d'un fichier

Pour un exemple simple, vous pouvez avoir un fichier représentant une image en noir et blanc, où chaque octet est soit 0 (pixel noir) ou 1 (pixel blanc), une ligne après l'autre. Peut-être que les deux premiers octets codent la largeur d'image sous la forme d'un nombre de 16 bits, et les deux autres octets codent la hauteur sous forme de nombre de 16 bits.

Cet exemple est très inefficace, car chaque octet de pixel ne peut jamais utiliser les valeurs possibles 2-255. Vous voudrez peut-être lire sur Théorie de l'information.

"fichier texte" est un format de fichier

Dans un fichier texte, chaque valeur possible 0-255 est donnée un sens, une lettre, un numéro, un symbole ou un "effet spécial" comme Newline. Sorte de. Strictement parler, dans le codage ASCII , seules les valeurs 0-127 ont une signification.

Il existe de nombreux encodages de texte différents, bien que quelques-uns quelques-uns. Dans Unicode , les caractères ne sont pas toujours de 1 octet de longueur.

Mais collez-vous avec ASCII. Si vous stockez "51a3" en tant que texte, les valeurs d'octets 53, 49, 97, 51 entreront dans le fichier, car elles correspondent à "5", "1", etc.

Si vous stockez la valeur hexadécimale 0x51 et 0xa3 comme octets , il y aura simplement ces deux octets (81, 163 en décimal.) Il s'agit donc de la moitié du nombre d'octets. Cependant, le fichier n'est plus un fichier texte car 163 n'est pas défini dans ASCII.

Autres formats de fichiers nécessitent un logiciel intégré à des fins

Les fichiers texte sont populaires car vous pouvez les ouvrir dans n'importe quel éditeur (Notepad, Nano). Comme vous le comprenez, ils ne sont pas très peu espagnols.

Mais il n'est pas difficile d'écrire votre propre logiciel. Voici un exemple.

#!/usr/bin/env python3

# PART 1 - WRITE BYTES TO A FILE

save_hex = "60b725f10c9c85c70d97880dfe8191b3"

print("Saving:", save_hex)

# group save_hex into groups of 2
save_ints = []
i = 0
while i < len(save_hex):
    # the 16 makes int() treat the value as hex
    integer = int(save_hex[i:i+2], 16)
    save_ints.append(integer)
    i+=2

print("Integer values:", save_ints)

# create a bytes object out of an array of numbers
save_raw = bytes(save_ints)

with open('myfile.raw', 'wb') as f:
    f.write(save_raw)



# PART 2 - READ BYTES FROM A FILE

with open('myfile.raw', 'rb') as f:
    contents = f.read()

print("Loaded: ", end='')
for byte in contents:
    print('{:02x}'.format(byte), end='')
print()

Après avoir exécuté ce chèque, la longueur du fichier est la moitié de la longueur de la chaîne hexagonale. Apprenez également à utiliser un outil hexdump pour inspecter le contenu du fichier.

Objets d'octets Avoir beaucoup de fonctionnalités, mais si vous utilisez l'idée de base ci-dessus (liste des intentes dans la plage 0-255 -> Objet d'octets) et (itérale sur des octets d'octets et obtenez-en une plage 0-255), vous n'avez pas besoin de devenir trop profondément dans les détails.

Le logiciel de compression tout usage ne comprend généralement pas les fichiers qu'il comprime

Lorsque vous mettez un fichier MP3 dans un zip ou un rar, le logiciel de compression traite comme une séquence d'octets, de la même manière qu'il traiterait d'un fichier JPEG ou EXE ou HTML.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top