Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment écrire une valeur hexa sur 2 bytes

Sujet résolu
    15 mai 2019 à 17:06:28

    Bonjour,

    J'ai ceci:

    unsigned char value = 0x05;

    Je voudrais le write (dans un fichier) sur deux bytes.

    Donc si je fais:

    $> hexdump -C fd
    
    >> 00 05

    J'ai essayé de faire 

    write(fd, value, 2);

    mais ca n'a pas vraiment de sens...

    Du coup, je me suis dis que je devais décomposer la value en 2 parties et write ces deux parties. Cependant je ne comprends pas comment faire cette décomposition.

    Merci à vous!:)


    • Partager sur Facebook
    • Partager sur Twitter
      15 mai 2019 à 17:32:59

      L'endiannes a de l'importance ou pas? Ou autrement dit, le fichier peut-il être lu par un processeur gérant l'ordre des octets de manière différente de celui du tien.

      -
      Edité par zoup 15 mai 2019 à 17:33:43

      • Partager sur Facebook
      • Partager sur Twitter
        15 mai 2019 à 17:36:34

        Je ne sais pas si je repond a la question mais le system est BIG ENDIAN.

        (du coup j'ai une autre question.. Comment fait-on pour inverser un byte ?

        -
        Edité par TheoCerutti 15 mai 2019 à 17:37:08

        • Partager sur Facebook
        • Partager sur Twitter
          15 mai 2019 à 19:08:20

          TheoCerutti a écrit:

          Du coup, je me suis dis que je devais décomposer la value en 2 parties et write ces deux parties. Cependant je ne comprends pas comment faire cette décomposition.

          Si je comprend bien le byte de poids fort est toujours 0, donc tu écris 0, puis le byte de poids faible value. Il suffit d'inverser l'écriture si tu veux écrire en little indian

          • Partager sur Facebook
          • Partager sur Twitter
            15 mai 2019 à 21:33:57

            "Je ne sais pas si je repond a la question "

            Non, je te demandais si le fichier devait éventuellement être lu sur un autre processeur utilisant un endiannes différent.

            "Comment fait-on pour inverser un byte ?" Ca veut dire quoi inverser un byte? Un exemple?

            -
            Edité par zoup 15 mai 2019 à 21:34:35

            • Partager sur Facebook
            • Partager sur Twitter
              16 mai 2019 à 3:15:53

              je ne sais pas si je comprend bien le problème.

              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                16 mai 2019 à 8:04:53

                bonjour, en fait ta question est un peut ambigue, nous avons besoin de savoir qui doit lire le fichier obtenue et à quoi il va servir (en gros est-ce un humain qui va le lire ou bien une machine) ?

                Si c'est un humain il suffit d'ecrire ce que tu veux dans un fichier texte comme ceci :

                fprintf ( file, "%02x %02x", (value >> 8) & 0xff, value & 0xff );

                avec cette ligne ça écrira --dans un fichier texte-- l'hexa comme dans ton exemple. Par contre ce sera bien du texte et non pas un code binaire utilisable par ton PC !

                Si c'est une machien alors tu veux ecrire du binaire --pas un text representant du binaire--, il va donc juste faloir ecrire les données avec un write :

                write ( fd, data, size );

                -
                Edité par ox223252 16 mai 2019 à 8:08:39

                • Partager sur Facebook
                • Partager sur Twitter

                la connaissance est la seule chose qui ne nous appauvrit pas quand on la partage.

                Un tuto sur les makefile et mon GitHub

                  16 mai 2019 à 19:31:14

                  Au final, j'ai réussi à faire ce que voulais.

                  Du coup pour écrire la valeur hexa sur 2 byte j'ai tout simplement cast le int en (short).

                  Pour inverser le byte donc inverser par ex:

                  0x01 (01 en bits)

                  J'ai tout simplement cast en char * le int et j'ai alors modifié inversé le char *.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 mai 2019 à 20:55:38

                    Rien ne garantit qu'un short fera 2 octets.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 mai 2019 à 3:51:07

                      Ma définition de byte et hexa est:

                      Un byte est une suite de 8 bits successifs

                      Un hexa est une suite de 4 bits successifs

                      On appelle aussi hexa la représentation en caractères de ces bits

                      Par exemple, 0x5c représente 0101 1100

                      Pour placer les deux hexa du byte sur deux bytes, je ferais:

                      unsigned char upper, lower;

                      upper = (value>>4)&0xf;

                      lower = value&0xf;

                      Pour inverser, je ferais:

                      value = lower * 16 + upper;

                      Si on veut écrire en caractères, on définit:

                      char car[16] = {'0', '1', ... 'e', 'f'};

                      Puis on imprime:

                      fprintf(fd, "%c%c", car[upper], car[lower]);

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        18 mai 2019 à 7:00:17

                        Si il s'agit de produire du texte formaté représentant une valeur en hexadécimal , il est plus simple d'utiliser le format %x, qui est fait pour.

                        Genre 

                        printf("%02x", valeur);

                        0 pour avoir au besoin des zéros non significatifs, 2 pour le nombre de caractères 

                        ---

                        Sinon, il existe des fonctions dont le rôle est de représenter des nombres dans "l'ordre réseau", indépendamment de celui de la machine hôte.

                        Je traduis, la mode étant apparemment de write avec des words en english, il y a des fonctions de la lib qui servent à reverse les bytes d'un int if needed pour les write dans un file ou pour les socketter. Et le Network Byte Order, c'est big-endian, aka Most Signifiant Byte.

                        Elles portent sur des entiers de taille bien précises : 16 bits ou 32 bits non signées.

                        NAME
                               htonl,  htons,  ntohl,  ntohs - convert values between host and network
                               byte order

                        SYNOPSIS
                               #include <arpa/inet.h>

                               uint32_t htonl(uint32_t hostlong);

                               uint16_t htons(uint16_t hostshort);

                               uint32_t ntohl(uint32_t netlong);
                         
                               uint16_t ntohs(uint16_t netshort);

                        Ici comme il y a deux bytes dans ton int il faut que tu choose les short.

                        -
                        Edité par michelbillaud 18 mai 2019 à 16:51:20

                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 mai 2019 à 19:53:41

                          Est-ce que l'ancien format du type %m.nX fonctionne encore?

                          m représentait la longueur du champ et n le nombre de digits imprimé.

                          Par exemple: %3.2X réservait 3 positions et on exige au moins 2 digits.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le Tout est souvent plus grand que la somme de ses parties.

                            20 mai 2019 à 2:06:14

                            Ho! miracle! J'ai découvert ce que veulent dire les noms (vive l'anglais):

                            htonl : Host to Network Long

                            ntohs : Network to Host Short

                            Merci Michel

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Le Tout est souvent plus grand que la somme de ses parties.

                            Comment écrire une valeur hexa sur 2 bytes

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            • Editeur
                            • Markdown