[R] Modifier tous les caractères d'un fichierHex

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

[R] Modifier tous les caractères d'un fichierHex

#1

Message par SagePourpre »

Bonjour à tous !


Je sollicite votre aide afin de concrétiser cet objectif farfelu que je me suis fixé et
dont je n'arrive point à me défaire.


J'aimerais créer en quelque sorte un programme de compression et j'ai besoin de jouer avec
un fichier source puis d'en écrire un autre à l'aide des informations du fichier source.

Voilà mon code... (J'aimerais avoir des conseils pour l'optimiser car pour l'instant, le processus prend plusieurs heures :cry:





En gros, ce que ce code fait, il ouvre un fichier en hex, puis réécrit chaques caractères hexadécimal pair dans un fichier.
Donc, si mon fichier est 0XBADADFC, le fichier écrit serait 0XAAF
123 4567 246



Présentement, avec le script actuel, il y'a de gros problèmes.
Il est extrêmement lent...



Code : Tout sélectionner

$source = "C:\Users\Sage Pourpre\Desktop\Projet compression ultime\01. Over The Hills And Far Away.rar"
$dest = "C:\Users\Sage Pourpre\Desktop\Projet compression ultime\01. Over The Hills And Far Away"
$f = FileOpen($source, 16)
$count = 1  ; conteur (pour travailler avec 100 000 caractères à la fois plutôt que la totalité)



$r = FileRead($f)
FileClose($f)
$r2 = ""
$len = (StringLen($r) - 2)
ConsoleWrite($len & @CRLF)
$f = FileOpen($dest, 17)
For $i = 1 To $len
    $ii = $i + 2
    
    If $i = $count Then
        $count += 100000
        If $count > $len Then
            $count = $len
        EndIf
        $r2 = StringMid($r, $count - 1000, $count)
        ConsoleWrite($count - 1 & @CRLF)
    Else
        If IsInt($ii / 2) Then
            
            FileWrite($f, StringMid($r2, $ii, 1))
            
            
        EndIf
        
        
        

    EndIf
Next


FileClose($f)
$r2 est la variable que j'utilise en conjonction avec StringMid. Je m'en sert pour stocker les 100 000 prochains caractères à vérifier plutôt que directement sur la variable $r (qui est un "string" de la longueur totale du fichier... dans ce cas-ci 23 600 000+)

Il semble plus rapide d'utiliser fileWrite après chaque opération plutôt que de collecter des milliers de caractères en mémoire
puis de les écrire qu'ensuite.


L'idéal serait de pouvoir "lire" le fichier au fur et à mesure de l'opération plutôt que de le lire en entier avant de commencer
mais je n'ai rien trouvé me permettant de faire celà.

Des idées pour améliorer la vitesse d'éxécution de ce script ?...
Modifié en dernier par SagePourpre le mer. 27 mai 2009 02:58, modifié 1 fois.
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11816
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Modifier tous les caractères d'un fichierHex

#2

Message par Tlem »

J'adore les gens qui veulent faire passer une amarre de bateau dans le chat d'une aiguille. :lol:

Franchement, AutoIt n'est pas ce qui ce fait de mieux pour faire de la compression de fichiers, mais j'admire le courage de certain. :roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [...] Modifier tous les caractères d'un fichierHex

#3

Message par SagePourpre »

Tlem a écrit :J'adore les gens qui veulent faire passer une amarre de bateau dans le chat d'une aiguille. :lol:

Franchement, AutoIt n'est pas ce qui ce fait de mieux pour faire de la compression de fichiers, mais j'admire le courage de certain. :roll:

Haha... merci ... enfin je pense... :roll:

Cela répond malheureusement à mes craintes sur le sujet... :|



M'enfin, je vais probablement ajouter un bouton "Enregistrer la progression et reprendre plus tard" dans mon script pour
pouvoir arrêter/redémarrer/mettre en veille sans perdre ma progression.

Je ne sais vraiment pas pourquoi, mais je dois voir le fichier modifié à l'aide de ce script... (une sorte d'obsession malsaine
qui m'a prise.)
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
TaPuZ
Niveau 4
Niveau 4
Messages : 75
Enregistré le : jeu. 14 mai 2009 17:10
Status : Hors ligne

Re: [...] Modifier tous les caractères d'un fichierHex

#4

Message par TaPuZ »

Coucou.
Histoire de partager ton obsession, pourrais-tu m'expliquer quel est le but exact de ce script?
Pourquoi ne garder que les valeurs Hex pairs? La finalité m'échappe, et du coup, j'ai du mal à m'enflammer aussi, :roll:
Et surtout à chercher une issue à ce script.
A bientôt,
T@PµZ.
A bientôt,
T@PµZ.
____________________________________
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [...] Modifier tous les caractères d'un fichierHex

#5

Message par SagePourpre »

TaPuZ a écrit :Coucou.
Histoire de partager ton obsession, pourrais-tu m'expliquer quel est le but exact de ce script?
Pourquoi ne garder que les valeurs Hex pairs? La finalité m'échappe, et du coup, j'ai du mal à m'enflammer aussi, :roll:
Et surtout à chercher une issue à ce script.
A bientôt,
T@PµZ.

En fait, ce que je veux tenter de trouver, c'est un moyen de compresser davantage un fichier au-delà de la compression
maximale atteinte avec un logiciel de compression normal.

Naturellement, comme Tlem l'a si bien imagé, Autoit n'est apparemment pas le bon langage pour s'attaquer à ce genre
de question de façon efficace... *sigh*

Le but très précis de ce script était surtout de tester la vitesse d'exécution
d'un script autoit qui traiterait un à un tous les caractères hex d'un fichier pour
éventuellement faire quelque chose de concret.

Présentement, le script (en prenant seulement les paires de car. Hex) ne mène à rien de concret, outre
me donner une idée de la vitesse d'exécution du processus entier (plus de 4 heures pour un fichier de 10 meg).

Voilà donc pourquoi je veux tenter de l'optimiser avant de faire de plus amples test.

Je ne souhaite pas apprendre le "C" uniquement pour ça mais par contre, si jamais j'arrive à faire quelque chose
de concret, disons par exemple compresser de 25% un fichier déjà supposé être compressé à son maximum, je tenterai
peut-être une petite incursion du côté du "C" pour réaliser un "prototype" plus rapide.
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [...] Modifier tous les caractères d'un fichierHex

#6

Message par SagePourpre »

Le même code optimisé.

Le seul fait de poser la question ici m'a aidé :mrgreen: .

Une combinaison Stringtrimleft/stringleft se révèle beaucoup plus efficace que d'utiliser stringMid sur
la totalité du "string" (de 23 millions de caractères) chaque fois.


► Afficher le texte
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
TaPuZ
Niveau 4
Niveau 4
Messages : 75
Enregistré le : jeu. 14 mai 2009 17:10
Status : Hors ligne

Re: [R] Modifier tous les caractères d'un fichierHex

#7

Message par TaPuZ »

Ok! Je saisis mieux maintenant le but. J'ai cru un instant que tu avais décidé de compresser en enlevant les caractères pairs!!! :lol: :lol:
C'est pour cela que je m'interrogeais! Tu me rassures, :wink:
A titre d'info, pour un même fichier de 10 Mo, tu es passé à combien de temps?
A bientôt,
T@PµZ.
____________________________________
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [R] Modifier tous les caractères d'un fichierHex

#8

Message par SagePourpre »

TaPuZ a écrit :Ok! Je saisis mieux maintenant le but. J'ai cru un instant que tu avais décidé de compresser en enlevant les caractères pairs!!! :lol: :lol:
C'est pour cela que je m'interrogeais! Tu me rassures, :wink:
A titre d'info, pour un même fichier de 10 Mo, tu es passé à combien de temps?

à peu près 8 minutes.

Considérant que je n'utilise pas un langage fait pour faire cela efficacement, c'est quand même bien.
En tout cas toujours meilleurs que mes premiers test...
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
TaPuZ
Niveau 4
Niveau 4
Messages : 75
Enregistré le : jeu. 14 mai 2009 17:10
Status : Hors ligne

Re: [R] Modifier tous les caractères d'un fichierHex

#9

Message par TaPuZ »

Ah oui. Passer de 4H à 8 minutes, effectivement, le "mieux" est significatif. Si tu arrives à garder ce ratio de 30, la prochaine fois, tu auras un fichier traité en moins de 17 secondes! :lol:
N'hésite pas à poster les suites de tes recherches, car, si je ne peux t'aider en quoique ce soit, je trouve qu'intellectuellement, la démarche est intéressante, et pourra me permettre de me faire une idée sur la façon de simplifier mes scripts dans le futur.
Bon courage pour la suite,

T@PµZ.
A bientôt,
T@PµZ.
____________________________________
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [R] Modifier tous les caractères d'un fichierHex

#10

Message par tolf »

Au lieu de faire des StringMid en cascade, faites FileRead() avec un seul caractère :

Code : Tout sélectionner

FileRead($handle_fichier, 1)
Deuxièmement, je doute que vous puissiez surcompresser de 25% un fichier déjà au maximum pour plusieurs raisons :
- Vu le nombre de personnes qui se sont déjà attaquées au problème, je doute que vous ayez trouvé la solution miracle.
- Si vous pouvez compresser n'importe quoi de 25%, pourquoi ne pas recompresser à nouveau pour augmenter le ratio à l'infini afin d'obtenir un fichier... vide :lol:

Je trouve que l'idée de faire soi-même un algorithme de compression est intéressante, mais faut pas s'imaginer pouvoir faire des miracles avec.
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [R] Modifier tous les caractères d'un fichierHex

#11

Message par SagePourpre »

tolf a écrit :Au lieu de faire des StringMid en cascade, faites FileRead() avec un seul caractère :

Code : Tout sélectionner

FileRead($handle_fichier, 1)

Et comment je fais pour aller chercher mon deuxième caractère par la suite ? ...
Étant donné qu'il n'a pas de FileReadMid, je ne sais trop comment je pourrais
procéder avec FileRead($handle,1) ...

tolf a écrit : Deuxièmement, je doute que vous puissiez surcompresser de 25% un fichier déjà au maximum pour plusieurs raisons :
- Vu le nombre de personnes qui se sont déjà attaquées au problème, je doute que vous ayez trouvé la solution miracle.
- Si vous pouvez compresser n'importe quoi de 25%, pourquoi ne pas recompresser à nouveau pour augmenter le ratio à l'infini afin d'obtenir un fichier... vide :lol:

Je trouve que l'idée de faire soi-même un algorithme de compression est intéressante, mais faut pas s'imaginer pouvoir faire des miracles avec.


Je sais bien que nombres de personnes ayant plus d'expériences dans le sujets se sont attaqués au sujet, mais pour
une raison inconnue, je me suis réveillé un matin avec le "besoin" de répondre à certaines questions que
je me posais sur le sujet... certaines questions que je ne peux que résoudre en expérimentant moi-même sur le
sujet.

Peut-être l'entropie d'un fichier compressé est trop grande pour qu'il y'ait grand chose à faire...
D'ailleurs, c'est probablement le cas. Je ne me berce pas d'illusions, mais j'ai besoin de le vérifier par moi-même.
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [R] Modifier tous les caractères d'un fichierHex

#12

Message par Iste »

T'as essayé l'exemple de la doc pour fileread() ? :p

Code : Tout sélectionner

$file = FileOpen("test.txt", 0)

; Check if file opened for reading OK
If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

; Read in 1 character at a time until the EOF is reached
While 1
    $chars = FileRead($file, 1)
    If @error = -1 Then ExitLoop
    MsgBox(0, "Char read:", $chars)
Wend

FileClose($file)
 
Quand tu lance plusieurs FileRead(), le suivant lit la suite du 1er

Sinon, je doute que tu puisse compresser grand chose, mais ce qui est sur, c'est que tu peux compresser un peu !
a moin qu'on ai trouvé la compression ultime sans précalcul ^^
Signez ici
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [R] Modifier tous les caractères d'un fichierHex

#13

Message par SagePourpre »

Ah... Merci !... Je pense être en mesure effectivement de faire le tour du fichier de façon beaucoup plus vite et plus simple
avec cette utilisation du fileread() qui, apparemment, avait échappé à mon attention dans l'aide...





Et pour le résultat...
Qui vivra verra !

Je suis simplement curieux de voir, si avec une approche différente, on peut arriver à compresser davantage des données
compressées en conjonction avec la méthode Huffman ou LZW ...
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Répondre