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?

Était-ce utile?

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.

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