4x8 bits int à nombre entier de 32 bits
Question
J'ai
_int8 arr[0] = 0;
_int8 arr[1] = 0;
_int8 arr[2] = 14;
_int8 arr[3] = 16;
Je dois le convertir en un _int32 utilisant comme arr [0] comme première partie <..> et arr [3] en dernier. A la fin, il devrait être
_int32 back = 3600;
doit décalages de bits d'utilisation I ou lissée comme ça pour y parvenir?
La solution
Si vous connaissez l'ordre des octets (à savoir big endian ou little endian, vérifier sur wikipedia), et le tableau est mis en place dans l'ordre, vous pouvez simplement faire:
back = *(_int32 *)arr;
Ce interpréterai juste votre tableau de 4 octets comme un buffer contenant un entier de 32 bits. Dans votre exemple, cependant, je pense que vous l'avez mis en place pour le grand endian et x86 n'est pas. Donc, vous auriez besoin d'échanger quelques octets.
Par exemple:
_int32 back = arr[0] << 24 | arr[1] << 16 | arr[2] << 8 | arr[3];
ou quelque chose comme ça.
Autres conseils
Casting tous les à int
puis utilisez:
(arr[0] << 24) | (arr[1] << 16) | (arr[2] << 8) | arr[3]
Vous pouvez également:
_int32 back = 0;
for (int i = 0; i < 4; ++i)
back = (back << 8) | arr[i];
Il est probablement mon compilateur SCO mais je pense que j'ai eu des problèmes si je ne suis pas allé (arr [0] & 0xff) et ainsi de suite pour faire les changements. n'a certainement rien fait pas mal.