Pregunta

Tengo un montón de valores hexagonales almacenados como uint32*

  • 2009-08-25 17: 09: 25.597 partículas [1211: 20b] 68000000
  • 2009-08-25 17: 09: 25.598 partículas [1211: 20b] A9000000
  • 2009-08-25 17: 09: 25.598 partículas [1211: 20b] 99000000

Cuando me convierto a INT como está, son valores locos cuando deberían ser de 0 a 255 años, creo. Creo que solo necesito extraer los dos primeros dígitos. ¿Cómo hago esto? Intenté dividir por 1000000, pero no creo que funcione en hex.

¿Fue útil?

Solución

El objetivo C es esencialmente C con cosas adicionales en la parte superior. Sus operaciones habituales de cambio de bits (my_int >> 24 o lo que sea) deberían funcionar.

Otros consejos

Dado que espera <255 para cada valor y solo el byte más alto se establece en los datos de muestra que publicó, parece que su endiannessidad se mezcla: cargó un gran número de endian y luego lo interpretó como Little Endian, o viceversa, lo que hace que el orden de los bytes esté en el orden equivocado.

Por ejemplo, supongamos que teníamos el número 104 almacenado en 32 bits en una gran máquina endian. En la memoria, los bytes serían: 00 00 00 68. Si cargó esto en la memoria en una pequeña máquina endian, esos bytes se interpretarían como 68000000.

¿De dónde sacaste los números? ¿Necesita convertirlos en orden de bytes de máquina?

Esto suena absolutamente como un problema de endianness. Si lo es o no, el cambio de bits simple debe hacer el trabajo:

uint32_t saneValue = insaneValue >> 24;

Dividir por 0x1000000 debería funcionar (es decir, por 16^6 = 2^24, no 10^6). Eso es lo mismo que cambiar los bits por 24 (no sé la sintaxis OBJC, lo siento).

Intenta usar la función NSSwapInt(), es decir

int x = 0x12345678;
x = NSSwapInt(x);
NSLog (@"%x", x);

Debe imprimir "78563412".

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