Pregunta

Hola Im totalmente fuera de mi y mi cerebro está empezando a doler ..: (

Necesito para convertir un número entero de modo que se ajuste en una matriz de 3 byte. (Es que un int de 24 bits?) Y luego de vuelta otra vez para enviar / recibir este número de un flujo de bytes a través de un socket

Tengo:

NSMutableData* data = [NSMutableData data];

 int msg = 125;

 const void *bytes[3];

 bytes[0] = msg;
 bytes[1] = msg >> 8;
 bytes[2] = msg >> 16;

 [data appendBytes:bytes length:3];

 NSLog(@"rtn: %d", [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] intValue]);

 //log brings back 0

Creo que mi principal problema es que no sé cómo comprobar que, efectivamente, He convertido mi int correctamente cuál es la parte posterior conversión que tengo que hacer, así como para el envío de los datos.

Cualquier ayuda muy apreciada!

¿Fue útil?

Solución

Se podría utilizar una unión:

union convert {
    int i;
    unsigned char c[3];
};

convertir de int a bytes:

union convert cvt;
cvt.i = ...
// now you can use cvt.c[0], cvt.c[1] & cvt.c[2]

convertir de bytes a int:

union convert cvt;
cvt.i = 0; // to clear the high byte
cvt.c[0] = ...
cvt.c[1] = ...
cvt.c[2] = ...
// now you can use cvt.i

Nota: el uso de uniones de este modo se basa en el procesador de orden de bytes. El ejemplo que di funcionará en un sistema de pequeño endian (como x86).

Otros consejos

Suponga que tiene un entero de 32 bits. Desea que los inferiores 24 bits puestos en una matriz de bytes:

int msg = 125;
byte* bytes = // allocated some way

// Shift each byte into the low-order position and mask it off
bytes[0] = msg & 0xff;
bytes[1] = (msg >> 8) & 0xff;
bytes[2] = (msg >> 16) & 0xff;

Para convertir los 3 bytes de nuevo a un número entero:

// Shift each byte to its proper position and OR it into the integer.
int msg = ((int)bytes[2]) << 16;
msg |= ((int)bytes[1]) << 8;
msg |= bytes[0];

Y, sí, soy plenamente consciente de que hay formas más óptimas de hacerlo. El objetivo de lo anterior es la claridad.

¿Qué tal un poco de engaño puntero?

int foo = 1 + 2*256 + 3*65536;
const char *bytes = (const char*) &foo;
printf("%i %i %i\n", bytes[0], bytes[1], bytes[2]); // 1 2 3

Probablemente hay cosas que se deben tomar cuidado de, si se va a utilizar esto en el código de producción, pero la idea básica es cuerdo.

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