86 votes

Conversion d'un int en un tableau de caractères de 4 octets (C)

Hey, je suis à la recherche pour convertir un int qui est entrées par l'utilisateur dans 4 octets, que je suis de l'affectation à un tableau de caractères. Comment cela peut-il être fait?

Exemple:

Convertir des entrées de l'utilisateur de 175 à

00000000 00000000 00000000 10101111


Problème avec toutes les réponses jusqu'à présent, la conversion de 255 devrait entraîner 0 0 0 ff bien qu'il imprime comme: 0 0 0 ffffffff

unsigned int value = 255;   

buffer[0] = (value >> 24) & 0xFF;
buffer[1] = (value >> 16) & 0xFF;
buffer[2] = (value >> 8) & 0xFF;
buffer[3] = value & 0xFF;

union {
    unsigned int integer;
    unsigned char byte[4];
} temp32bitint;

temp32bitint.integer = value;
buffer[8] = temp32bitint.byte[3];
buffer[9] = temp32bitint.byte[2];
buffer[10] = temp32bitint.byte[1];
buffer[11] = temp32bitint.byte[0];

la fois le résultat en 0 0 0 ffffffff au lieu de 0 0 0 ff

Juste un autre exemple est de 175 que l'entrée imprime comme 0, 0, 0, ffffffaf alors qu'il devrait simplement être 0, 0, 0, af

160voto

caf Points 114951

Le portable de façon à le faire (s'assurer que vous obtenez 0x00 0x00 0x00 0xaf partout) est d'utiliser les quarts:

unsigned char bytes[4];
unsigned long n = 175;

bytes[0] = (n >> 24) & 0xFF;
bytes[1] = (n >> 16) & 0xFF;
bytes[2] = (n >> 8) & 0xFF;
bytes[3] = n & 0xFF;

Les méthodes utilisant les syndicats et memcpy() obtiendrez un résultat différent sur différentes machines.


Le problème que vous rencontrez est avec l'impression plutôt que de la conversion. Je présume que vous utilisez char plutôt que d' unsigned char, et que vous utilisez une ligne de ce genre pour l'imprimer:

printf("%x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]);

Lorsque l'un des types plus étroit que l' int sont passés à l' printf, ils sont promus à la int (ou unsigned int, si int ne peut pas contenir toutes les valeurs de type de document). Si char est signé sur votre plate-forme, alors 0xff probable ne rentre pas dans la gamme de ce type, et il est en cours de mise à -1 à la place (qui est la représentation en 0xff sur un 2-en complément de la machine).

-1 est promue à un int, et a la représentation en 0xffffffff comme int sur votre machine, et c'est ce que vous voyez.

Votre solution c'est soit de l'utiliser réellement unsigned char, ou jeté à l' unsigned char dans la printf déclaration:

printf("%x %x %x %x\n", (unsigned char)bytes[0],
                        (unsigned char)bytes[1],
                        (unsigned char)bytes[2],
                        (unsigned char)bytes[3]);

16voto

Blastfurnace Points 8160

Voulez-vous adresser les octets individuels d'un entier 32 bits? Une méthode possible est une union:

 union
{
    unsigned int integer;
    unsigned char byte[4];
} foo;

int main()
{
    foo.integer = 123456789;
    printf("%u %u %u %u\n", foo.byte[3], foo.byte[2], foo.byte[1], foo.byte[0]);
}
 

Remarque: corrigé le printf pour refléter les valeurs non signées.

2voto

jbernadas Points 1154

Tu peux essayer:

 void CopyInt(int value, char* buffer) {
  memcpy(buffer, (void*)value, sizeof(int));
}
 

1voto

Luiz Felipe Points 655

Pourquoi auriez-vous besoin d'un transtypage intermédiaire pour annuler * en C ++ Parce que cpp n'autorise pas la conversion directe entre pointeurs, vous devez utiliser reinterpret_cast ou le transtypage pour annuler * fait la chose.

0voto

gandjustas Points 1451
int a = 1;
char * c = (char*)(&a); //In C++ should be intermediate cst to void*

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X