Question

Je veux prendre la valeur stockée dans un entier non signé 32 bits, la placer dans quatre caractères, puis stocker la valeur entière de chacun de ces caractères dans une chaîne.

Je pense que la première partie va comme ceci:

char a = orig << 8;
char b = orig << 8;
char c = orig << 8;
char d = orig << 8;
Était-ce utile?

La solution

Si vous voulez vraiment extraire d'abord les octets individuels:

unsigned char a = orig & 0xff;
unsigned char b = (orig >> 8) & 0xff;
unsigned char c = (orig >> 16) & 0xff;
unsigned char d = (orig >> 24) & 0xff;

Ou:

unsigned char *chars = (unsigned char *)(&orig);
unsigned char a = chars[0];
unsigned char b = chars[1];
unsigned char c = chars[2];
unsigned char d = chars[3];

Ou utilisez l'union d'un long non signé et de quatre caractères:

union charSplitter {
    struct {
        unsigned char a, b, c, d;
    } charValues;

    unsigned int intValue;
};

charSplitter splitter;
splitter.intValue = orig;
// splitter.charValues.a will give you first byte etc.

Mise à jour: comme l'ont fait remarquer Friol, les solutions 2 et 3 ne sont pas agonisantes; les octets a , b , c et d dépendent de l'architecture de la CPU.

Autres conseils

Disons " orig " est une variable de 32 bits contenant votre valeur.

J'imagine que vous voulez faire quelque chose comme ça:

unsigned char byte1=orig&0xff;
unsigned char byte2=(orig>>8)&0xff;
unsigned char byte3=(orig>>16)&0xff;
unsigned char byte4=(orig>>24)&0xff;

char myString[256];
sprintf(myString,"%x %x %x %x",byte1,byte2,byte3,byte4);

En passant, je ne suis pas sûr que ce soit toujours correct. ( Edit : en effet, c’est correct, car les opérations de décalage de bits ne devraient pas être affectées par l’endianisme)

J'espère que cela vous aidera.

Utilisez une union . (Comme demandé, voici l'exemple de programme.)

    #include <<iostream>>
    #include <<stdio.h>>
    using namespace std;

    union myunion
    {
       struct chars 
       { 
          unsigned char d, c, b, a;
       } mychars;

        unsigned int myint; 
    };

    int main(void) 
    {
        myunion u;

        u.myint = 0x41424344;

        cout << "a = " << u.mychars.a << endl;
        cout << "b = " << u.mychars.b << endl;
        cout << "c = " << u.mychars.c << endl;
        cout << "d = " << u.mychars.d << endl;
    }

Comme James l'a mentionné, il s'agit d'une plate-forme spécifique.

Pas tout à fait:

char a = orig & 0xff;
orig >>= 8;
char b = orig & 0xff;
orig >>= 8;
char c = orig & 0xff;
orig >>= 8;
char d = orig & 0xff;

Vous ne savez pas exactement ce que vous entendez par & stocker; stocker les valeurs entières de chacune de ces valeurs dans une chaîne. Voulez-vous transformer 0x10111213 en "16 17 18 19" ou quoi?

Pour hexadécimal:

sprintf(buffer, "%lX", orig);

Pour le nombre décimal:

sprintf(buffer, "%ld", orig);

Utilisez snprintf pour éviter un débordement de tampon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top