IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Modification automatique d'une chaîne hexadécimale dans un fichier [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Mécanicien
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Mécanicien

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Par défaut Modification automatique d'une chaîne hexadécimale dans un fichier
    Bonjour à tous,


    Toujours dans le but de la traduction de mon script Bash en Python, je cherche à automatiser la modification de chaîne(s) hexadécimal(s) .
    Pour info , je part de flash extraites de différents ECU automobile (Calculateur moteur , BSI, UCH....), ces flash sont au format binaire.

    Voici un extrait de mon code Bash:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    if [ $marque = "1" ]
    then
            echo ""
            echo -e "${cyanclair}Choisissez la fonction à exécuter.${neutre}"
            echo ""
            echo -e "${cyanclair}Pour FAP OFF EDC16C34 tapez :${neutre} ${orange}1${neutre}     ${cyanclair}Pour IMMO OFF SID801 tapez :${neutre} ${orange}2${neutre}"
            echo -e "${cyanclair}Pour IMMO VIERGE SID801 tapez :${neutre} ${orange}3${neutre}     ${cyanclair}Pour IMMO OFF EDC15C2/C7 tapez :${neutre} ${orange}4${neutre}"
            echo -e "${cyanclair}Pour EGR CLOSE EDC16C34 tapez :${neutre} ${orange}5${neutre}     ${cyanclair}Pour IMMO OFF EDC17C10 tapez :${neutre} ${orange}6${neutre}"
            echo -e "${cyanclair}Pour VIERGE PIN EDC17C10 tapez :${neutre} ${orange}7${neutre}     ${cyanclair}Pour VIERGE EEPROM 95128 JC EVO tapez :${neutre} ${orange}8${neutre}"
            read fonction1
                    if [ $fonction1 = "1" ]
                    then
                            echo ""
                            echo -e "${cyanclair}Choisissez le fichier à modifier.${neutre} ${orange}(veuillez écrire le nom complet de votre fichier.)${neutre}"
                            read fichier
                            xxd $fichier > copie.txt
                            sed -e "s/02 01 01 00 0c 3b/00 00 01 00 0c 3b/g" copie.txt>fichier_mod.txt
                            xxd -r fichier_mod.txt > fichier_DPF_OFF.bin
                            rm fichier_mod.txt && rm copie.txt
                            echo ""
                            echo -e "${vertclair}TERMINÉ!${neutre}"
                            echo -e "${vertclair}Votre fichier modifié a été enregistrer sous 'fichier_DPF_OFF.bin'.${neutre}"
                            echo ""
                            echo -e "${rougefonce}!!!VEUILLEZ CORRIGER LE CHECKSUM AVANT L'ÉCRITURE!!!${neutre}"

    xxd pour la conversion du fichier .bin en .txt
    sed pour la modification et la sauvegarde du fichier modifier
    xxd pour convertir le fichier modifié du format .txt vers le format .bin

    Pour la boucle pas de problème, mais je but sur la conversion du fichier ainsi que sur la modification sachant que le but est que le script puisse être compatible avec windaube
    Si quelqu'un pourrait me mettre sur une piste ça serait top.
    Merci par avance .
    Jon

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Avec Python, on peut lire le fichier en mode binaire et récupérer une séquence de bytes.
    Ici je la fabrique à la main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> b = bytes([0,1,2,3,0,1,2,3])
    >>> b
    b'\x00\x01\x02\x03\x00\x01\x02\x03'
    puis je peux remplacer les occurences de 1, 2 par 0, 0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> b.replace(bytes([1,2]), bytes([0, 0]))
    b'\x00\x00\x00\x03\x00\x00\x00\x03'
    >>>
    pas besoin de xxd ni de sed...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Mécanicien
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Mécanicien

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Par défaut
    Bonjour,

    Merci @wiztricks pour ta réponse.

    Je pense avoir compris ton explication , mais me voila confronté à un problème lors de l'ouverture de mon fichier.

    Voici le code utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    while marque == '1':
        print()
        print('Choisissez la fonction à exécuter')
        print()
        print('Pour FAP OFF EDC16C34 tapez : 1' + '     ' + 'Pour IMMO OFF SID801 tapez : 2')
        print('Pour IMMO VIERGE SID801 tapez : 3' + '     ' + 'Pour IMMO OFF EDC15C2/C7 tapez : 4')
        print('Pour EGR CLOSE EDC16C34 tapez : 5' + '     ' + 'Pour IMMO OFF EDC17C10 tapez : 6')
        print('Pour VIERGE PIN EDC17C10 tapez : 7' + '     ' + 'Pour VIERGE EEPROM 95128 JC EVO tapez : 8')
        break
     
    fonction = input()
    if fonction == '1':
        print()
        print('Choisissez le fichier à modifier. (Veuillez écrire le chemin et nom complet de votre fichier.)')
        fichier = input()
        with open('fichier',"rb") as f:
            data = f.read()
        print(data)
    Ma boucle s’exécute correctement , mais lorsque je renseigne le chemin et le nom de mon fichier j'ai le droit à cette erreur:
    Traceback (most recent call last):
    File "C:/Users/test/Desktop/DumpEdit_no-colors.py", line 100, in <module>
    with open('fichier',"rb") as f:
    FileNotFoundError: [Errno 2] No such file or directory: 'fichier'


    Pourtant mon fichier est bien présent à l'endroit renseigné.

    J'imagine que c'est une pauvre erreur de syntaxe mais j'ai essayé plusieurs façon et j'arrive toujours à ce message d'erreur...

  4. #4
    Membre averti
    Homme Profil pro
    Mécanicien
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Mécanicien

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Par défaut
    Je viens de réussir à acquitter l'erreur en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with open (fichier,'rb') as f:
            data = f.read()
    print(data)

    Mais par contre cela fait 30 min que ça mouline...

  5. #5
    Membre averti
    Homme Profil pro
    Mécanicien
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Mécanicien

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Par défaut
    Voici le retour de IDLE:
    Nom : 2021-07-13 09_34_21-[Python 3.X] Modification automatique d'une chaîne hexadécimale dans un fich.png
Affichages : 311
Taille : 23,0 Ko

    Donc si je comprends bien , le fichier est trop volumineux pour Idle.

    Je vais faire le test directement depuis cmd afin de voir si le problème reste le même.


    EDIT:

    C'est OK avec CMD.

  6. #6
    Membre averti
    Homme Profil pro
    Mécanicien
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Mécanicien

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Par défaut
    Rebonjour,

    Voici ce que j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if fonction == '1':
        print()
        print('Choisissez le fichier à modifier. (Veuillez écrire le chemin et nom complet de votre fichier.)')
        fichier = input()
        with open (fichier,'rb') as f:
            data = f.read()
            b = bytes([2,1,1,0,c,3,b])
            b.replace(bytes([2,1,1,0,c,3,b]), bytes([0,0,1,0,c,3,b]))
    Ce qui me retourne l'erreur:
    Traceback (most recent call last):
    File "C:\Users\test\Desktop\DumpEdit_no-colors.py", line 102, in <module>
    b = bytes([2,1,1,0,c,3,b])
    NameError: name 'c' is not defined



    Je continue mes recherches et vous tiens au courant de l'évolution des choses.

    Jon.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rechercher une chaine hexadécimale dans un fichier
    Par HeinCode dans le forum Débuter
    Réponses: 8
    Dernier message: 02/06/2020, 18h53
  2. Réponses: 2
    Dernier message: 25/12/2010, 12h42
  3. Réponses: 5
    Dernier message: 09/07/2007, 19h07
  4. Changer un caractère dans une chaîne contenue dans une phrase
    Par cirtey dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/03/2007, 16h16
  5. conversion d'une chaîne hexadécimale en 3 int
    Par loacast dans le forum C++
    Réponses: 2
    Dernier message: 27/02/2007, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo