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 :

modifier des décimales en Bits


Sujet :

Python

  1. #1
    Membre averti
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Par défaut modifier des décimales en Bits
    Je suis novice en python et j'ai besoin d'obtenir des bits au lieu des décimales pour la partie qui concerne funcCode ==1, j'obtiens par exemple les valeurs suivantes:
    64,3... au lieu de 0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0: 0,0,0,0,0,0,1,0=64 et 1,1,0,0,0,0,0,0=3

    Voici ma fonction
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     def reg_val_list(s):
        v = []
        for p in s:
            if p.haslayer('ModbusADUResponse'):
                try:
                    if p['ModbusADUResponse'][1].funcCode == 6:
                        a = p['ModbusADUResponse'][1].registerValue
                        v.append(p['ModbusADUResponse'][1].registerValue)
                    elif p['ModbusADUResponse'][1].funcCode == 5:
                        v.append(p['ModbusADUResponse'][1].outputValue)
                    elif p['ModbusADUResponse'][1].funcCode == 1:
                        # for x in range(0, 8):
                        v += p['ModbusADUResponse'][1].coilStatus
                    elif p['ModbusADUResponse'][1].funcCode == 3:
                        v.extend(p['ModbusADUResponse'][1].registerVal)
                    else:
                        v += p['ModbusADUResponse'][1].registerVal
                except AttributeError:
                    pass
            elif p.haslayer('ModbusADURequest'):
                try:
                    a = p['ModbusADURequest'][1]
                    if p['ModbusADURequest'][1].funcCode in [15, 16]:
                         v += p['ModbusADURequest'][1].outputsValue
                except AttributeError:
                    pass
        return v
    Une solution ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    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 695
    Par défaut
    Salut,

    Vous avez essayé de faire quoi?
    Dans le code que vous montrez, on ne sait pas trop où vous récupérez ce que vous racontez ni sous quelle forme: un nombre flottant, une chaine de caractères, une liste...

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

  3. #3
    Membre averti
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Par défaut
    Désolé javais mis que la partie qui me pose problème. Il y a d'autres données que je dois récupérer mais il y a que le coilStatus qui me pose un problème de format voici le fichier main.py où on affiche les données:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     def main():
        # you can type the name of directory as well as file in the below variable
        pcap = "test.pcap"
        csvName = "out.csv"
        out = []
        print("[*] Loading PCAP")
        pcap = parser.read_pcap(pcap)
        print("[*] Starting session extraction")
        ss = pcap.sessions(parser.extractor)
        parameters = {
        "c_ip": None,
            "c_port": None,
            "c_pkts_all": None,
            "c_rst_cnt": None,
            "c_ack_cnt": None,
            "request_cnt_func1": None,
            "response_cnt_func1": None,
            "request_cnt_func2": None,
            "response_cnt_func2": None,
            "request_cnt_func3": None,
            "response_cnt_func3": None,
            "request_cnt_func4": None,
            "response_cnt_func4": None,
            "request_cnt_func5": None,
            "response_cnt_func5": None,
            "request_cnt_func6": None,
            "response_cnt_func6": None,
            "Register_value": None,	
            "Register_value1": None,			
            "Read/Write": None,
            "Modbus_err_code": None,
            "time_avg": None,
            "Protocol": None,
            "Service": None,
            "time_modbus_std": None,
            "Register_number": None
    }
        print("[+] Total Sessions Found:\t{}".format(len(ss)))
     
        count = 1
        for s in ss:
            print(f"[*] Processing Session: {count}")
            parameters["s_ip"], parameters["c_ip"] = parser.filter_ip(ss[s][0])
            sbsc = 1
            for sbs in split_session(ss[s], 1):
                print(f"[*] Processing Sub Session: {count}.{sbsc}")
                try:
                    data = retrieve(parameters, sbs)
                    pass
                except TypeError:
                    break
                print(data)
                out.append(data.copy())
                sbsc += 1
            count += 1
        csv_write(out, csvName)
     
     
    if __name__ == '__main__':
        main()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    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 695
    Par défaut
    Salut,

    Ca sert à rien de poster du code qu'on ne fera pas tourner.

    Essayez de décrire votre problème en sortant un peu le nez de votre code.
    Au départ çà ne parle que de bits et de conversion de 64 et 3.
    Imaginez que la conversion soit déléguée à une fonction Z qu'est-ce qu'elle va recevoir en entrée qu'est ce qu'elle doit produire en sortie?

    Tout ce qui n'a rien à voir avec cette fonction n'apporte pas grand chose à la compréhension du problème....et donc pas très utile.

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

  5. #5
    Membre averti
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Par défaut
    Très bien.

    Maintenant j'ai une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     def reg_val_list1(s):
        v = []
        for p in s:
            if p.haslayer('ModbusADUResponse'):
                try:
                    if p['ModbusADUResponse'][1].funcCode == 1:
                        v += p['ModbusADUResponse'][1].coilStatus
                except AttributeError:
                    pass
     
        return v
    Cette fonction me retourne des valeurs en décimal comme 64,3,... et je voudrais avoir ces mêmes valeurs en binaire c'est à dire:

    0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0: 0,0,0,0,0,0,1,0=64 et 1,1,0,0,0,0,0,0=3

    J'ai modifié la fonction en mettant plusieurs solutions mais aucune ne marche. J'ai fait cette modification:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def reg_val_list1(s):
        v = []
        u = []
        for p in s:
            if p.haslayer('ModbusADUResponse'):
                try:
                    if p['ModbusADUResponse'][1].funcCode == 1:
                        v += p['ModbusADUResponse'][1].coilStatus
                        u = "{0:b}".format(v)
                except AttributeError:
                    pass
           return u
    J'ai essayé aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       def reg_val_list1(s):
        v = []
        for p in s:
            if p.haslayer('ModbusADUResponse'):
                try:
                    if p['ModbusADUResponse'][1].funcCode == 1:
                        v += bin (p['ModbusADUResponse'][1].coilStatus)
                except AttributeError:
                    pass
           return v
    J'ai aussi essayé avec encode()

    Mais rien ne marche

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    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 695
    Par défaut
    Pour moi une fonction, c'est par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def Z(a, b):
          assert a == 64 and b = 3, "fatal, c'est pas encore codé"
          return (0,0,0,0,0,0,1,0), (1,1,0,0,0,0,0,0)
    après, reste à préciser le format des variables d'entrée et de sortie, donner d'autres exemples du genre Z(x, y) retourne blabla, puis on peut écrire le code.

    Cette fonction là, se fout pas mal de savoir d'où sont récupérés les paramètres a, b et ce que vous voulez faire des valeurs retournées.


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

Discussions similaires

  1. Modifier des bits spécifiques d'un registre
    Par Speakers dans le forum Assembleur
    Réponses: 5
    Dernier message: 04/04/2018, 20h38
  2. [V9] Modifier affichage des décimales des prix produit dans les rapports factures/devis
    Par audrey-scopecozimut dans le forum Odoo (ex-OpenERP)
    Réponses: 0
    Dernier message: 27/04/2017, 17h11
  3. TOAD - Modifier l'affichage des décimales dans le GRID
    Par farenheiit dans le forum Administration
    Réponses: 0
    Dernier message: 30/06/2008, 12h05
  4. Requete avec des décimales
    Par Sandrine75 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/06/2003, 10h18
  5. Réponses: 1
    Dernier message: 06/03/2003, 11h57

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