Pregunta

tengo

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

necesito para convertirlo en uno _int32 utilizando como matriz [0] como primera parte <..> y arr [3] cuya última. Al final debería ser

_int32 back = 3600;

cambios de uso de bits ¿Debo o Smth como que para lograr esto?

¿Fue útil?

Solución

Si conoce el orden de bytes (es decir big endian o little endian, encontrar esta información en Wikipedia), y la matriz se estableció en el orden correcto sólo se puede hacer:

back = *(_int32 *)arr;

Esto sólo va a interpretar su gama de 4 bytes como un amortiguador que sostenía un solo número entero de 32 bits. En su ejemplo, sin embargo, creo que lo tienes configurado para big endian y x86 no lo es. Así que había necesidad de cambiar algunos bytes.

Por ejemplo:

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

o algo por el estilo.

Otros consejos

Reparto todos ellos a continuación, utilizar int:

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

Alternativamente:

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

Es probablemente mi compilador SCO pero yo creo que he tenido problemas si yo no uso (arr [0] y 0xff) y así sucesivamente para hacer los cambios. Ciertamente, no se pierde nada de nada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top