Estoy trabajando con un sistema por el cual puedo enviar 1 32 bit int a la vez. Sin embargo necesito enviar dos números a la vez. ¿Cuál es la mejor manera de hacer esto en el estándar C?
¿Supongo que tendré que hacer alguna conversión a binario / hex y algún enmascaramiento?
Cualquier idea sería apreciada.
Gracias
Puede codificar dos números sin signo de 16 bits como este:
unsigned int out = (in1 << 16) | in2;
Y decodifíquelos así:
unsigned int in1 = out >> 16; unsigned int in2 = out & 0xFFFF;
Todo esto supone que int
es de al menos 32 bits, que in1
e in2
están en el rango 0-65535, y que un unsigned int
se puede enviar correctamente (wrt endianness).
Si los números que está enviando están entre 0 y 65535, empáquelos en el int de 32 bits que puede enviar:
unsigned int n1 = 42; unsigned int n2 = 1600; unsigned int numbertosend = (n1 << 16) | n2;
En el lado de recepción, desempaquetar el número
unsigned int n1 = receivednumber >> 16; unsigned int n2 = receivednumber & 0xFFFF;
¿Qué rango son tus números? Si pueden caber en 16 bits, entonces puede empaquetar dos de esos en su int de 32 bits. Algo como i = (n1 << 16) | (n2 &0xffff)
i = (n1 << 16) | (n2 &0xffff)
.
Podría codificar 2 números de 16 bits en un número de 32 bits. Por ejemplo:
int32 encode(int16 numA, int16 numb) { int 32 result = numA << 16 | numB; return result; } int16 decodeNum1(int32 num) { return (num >> 16) & 0xFFFF; } int16 decodeNum2(int32 num) { return (num) & 0xFFFF; }
Si los dos números que desea enviar son primos, puede multiplicarlos y enviar el producto y, en el servidor, calcularlos para obtener el resultado.
; p (inspirado en la ambigüedad de la pregunta)
Suponiendo que desea enviar 2 números de 16 bits, probablemente podría hacer algo como esto:
unsigned int a, b, toSend; // Give a and ba value... toSend = ( a << 16 ) | b;
Creo que los sindicatos en c harían el trabajo.