Domanda

ho

_int8 arr[0] = 0;
_int8 arr[1] = 0;
_int8 arr[2] = 14;
_int8 arr[3] = 16;

ho bisogno di convertirlo in una _int32 utilizzando come arr [0] come prima parte <..> e arr [3] come l'ultima. Alla fine dovrebbe essere

_int32 back = 3600;

turni uso bit dovrei o si dovrebbe occupare del genere per raggiungere questo obiettivo?

È stato utile?

Soluzione

Se si conosce l'ordinamento di byte (cioè big endian o little endian, il check-out su wikipedia), e l'array è configurato nel giusto ordine si può solo fare:

back = *(_int32 *)arr;

che ti basta interpretare l'array di 4 byte come un buffer possesso di un unico intero a 32 bit. Nel tuo esempio, però, penso che ce l'hai impostato per big endian e x86 non è. Così avresti bisogno di scambiare alcuni byte.

Per esempio:

_int32 back = arr[0] << 24 | arr[1] << 16 | arr[2] << 8 | arr[3];

o qualcosa del genere.

Altri suggerimenti

Fusione tutti a int quindi usare:

(arr[0] << 24) | (arr[1] << 16) | (arr[2] << 8) | arr[3]

In alternativa:

_int32 back = 0;
for (int i = 0; i < 4; ++i)
    back = (back << 8) | arr[i];

E 'probabilmente il mio compilatore SCO ma penso che ho avuto problemi se non ho usato (arr [0] & 0xFF) e così via per fare i turni. fa Certamente non male a nessuno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top