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

Calcul scientifique Python Discussion :

Convertir un nombre décimal en bytes


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Décembre 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Décembre 2016
    Messages : 24
    Par défaut Convertir un nombre décimal en bytes
    Bonjour, j'espère être sur le bon forum

    Je dois convertir un nombre décimal en bytes pour écrire ensuite dans un fichier binaire

    J'arrive bien a le faire avec la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nbredec = 128
    testhex = bytes([nbredec])
    print (testhex)
    Ca me donne le résultat : b'\x80'

    Par contre mon nombre décimal ne peut pas excéder 256, sinon j'ai le message d'erreur :

    ValueError: bytes must be in range(0, 256)

    Comment feriez vous dans ce cas la pour convertir un nombre supérieur a 256 ?

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    [Python 3] Si on veut stocker dans un fichier le nombre 128 sous forme de 3 octets b"1", b"2" et b"8", on peut faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print(bytes(str(128), encoding='ascii'))
    b'128'
    L'encodage doit être présent puisque str est en unicode sous Python 3.

    Si par contre on veut stocker le nombre comme il est en mémoire dans l'ordinateur, il faut utiliser le module "struct" et préciser le format. On peut ainsi retrouver l'entier sous forme de 4 octets, tel qu'il est codé dans le C.

  3. #3
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Décembre 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Décembre 2016
    Messages : 24
    Par défaut
    Peux tu me dire comment tu ferais avec STRUCT ? j'ai bien vu qu'il faut utiliser la commande PACK mais j'ai du mal a voir la commande a utiliser exactement

    Désolé mais je débute sous python et j'ai parfois du mal avec certaines commandes

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Un petit tour dans la doc et hop:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import struct
     
    s =  struct.pack("i", 128) # le format "i" est l'entier en 4 octets
    print(s)
    b'\x80\x00\x00\x00'
     
    x = struct.unpack("i", s)[0] # le [0] est nécessaire car unpack renvoie toujours un tuple
    print(x)
    128

  5. #5
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Décembre 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Décembre 2016
    Messages : 24
    Par défaut
    Lol, je comprends pas, je voulais un résultat sur deux octets, par exemple pour la valeur 576, j'ai une valeur bytes : b'\x02@'

    Alors que la tu as un résultat sur quatre octets : b'\x80\x00\x00\x00' et en plus séparé par des \

    Comme je dois rebalancer ca ensuite dans un fichier binaire, j'ai peur que ca m'écrase des octets, car je ne suis censé changer tout ces octets

    Comment ferais tu justement pour cet exemple : 576 devient b'\x02@'

    ???

    Merci

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par poseidon31 Voir le message
    Comment ferais tu justement pour cet exemple : 576 devient b'\x02@'
    Le format "i" code l'entier sur 4 octets. Pour le coder sur 2 octets, il faut ouvrir la documentation et trouver le format qui va bien.
    note: travailler sur des représentations binaires demande de comprendre un peu ce que vous faites. Au delà du nombre d'octets, vous avez aussi à tenir compte de l'endianess.

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

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Tu n'as pas demandé "2 octets", et je n'ai pas laissé de doute sur le fait qu'avec struct et l'entier normal du C, tu en aurais 4.

    Mais si tu en veux 2, tu remplaces le format "i" par "h" (pour short) et ça devrait marcher.

    on peut aussi utiliser une autre méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s = (128).to_bytes(2, byteorder='little')
    print(s)
    b'\x80\x00'
    On obtient bien les 2 1ers octets du résultat en 4 octets de struct.

    Et ce sont bien 2 octets b'\x80' et b'\x00':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print(len(b'\x80\x00'))
    2
    Bien sûr, il ne faut pas dépasser 2**16-1=65535. Au delà, ça déclenche une exception puisqu'il est impossible de placer un tel nombre dans 2 octets.

    Pour savoir si c'est byteorder='little' ou 'big': ça dépend de la machine et de l'OS, et il faut questionner sys.byteorder.

    Dans l'exemple du nombre 576:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s = (576).to_bytes(2, 'little')
    print(s)
    b'@\x02'
    Là, on trouve un "@" et cette utilisation n'est pas dans la doc de Python. Par contre, len(b'@\x02')=2, donc on a bien les 2 octets (pas plus, pas moins).

    Pour retrouver le nombre d'origine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = int.from_bytes(b'@\x02', byteorder='little')
    print(x)
    576
    [edit] Apparemment, le b'@' remplace le byte b'\x40', ce qui correspond à la valeur décimale entière 64.:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = int.from_bytes(b'\x40\x02', byteorder='little')
    print(x)
    576

Discussions similaires

  1. Convertir un nombre décimal en float 32bits
    Par Anonyme5571 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 14/04/2015, 10h51
  2. Convertir un nombre décimal fractionnaire négatif en base 2
    Par christian79 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 09/04/2013, 13h55
  3. convertir des jours heures minutes en nombre décimal
    Par Menez express dans le forum Excel
    Réponses: 2
    Dernier message: 26/09/2008, 18h10
  4. convertir un texte (1.114,28-) en nombre décimal
    Par Jujube83 dans le forum VBA Access
    Réponses: 3
    Dernier message: 27/08/2007, 19h01
  5. Comment convertir un nombre de jours décimal en date
    Par Soutou dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/11/2005, 00h57

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