Используя 1 int для отправки 2 номеров - PullRequest
1 голос
/ 13 марта 2011

Я работаю с системой, в которой я могу отправлять 1 32-битное целое число за раз.Однако мне нужно отправить два номера одновременно.Каков наилучший способ сделать это в стандартном C?

Я предполагаю, что мне придется сделать какое-то преобразование в двоичный / шестнадцатеричный код и некоторое маскирование?

Любые идеи приветствуются.

Спасибо

Ответы [ 7 ]

4 голосов
/ 13 марта 2011

Вы можете кодировать два 16-битных без знака числа, например:

unsigned int out = (in1 << 16) | in2;

и декодировать их следующим образом:

unsigned int in1 = out >> 16;
unsigned int in2 = out & 0xFFFF;

Все это предполагает, что *Значение 1009 * составляет не менее 32 бит, что in1 и in2 находятся в диапазоне 0-65535, и что unsigned int может быть отправлено корректно (относительно порядка байтов).

2 голосов
/ 13 марта 2011

Если числа, которые вы отправляете, находятся в диапазоне от 0 до 65535, каждое просто упакуйте их в 32-битное целое число, которое вы можете отправить:

unsigned int n1 = 42;
unsigned int n2 = 1600;
unsigned int numbertosend = (n1 << 16) | n2;

На принимающей стороне распакуйте номер

unsigned int n1 = receivednumber >> 16;
unsigned int n2 = receivednumber & 0xFFFF;
1 голос
/ 14 марта 2011

Если два числа, которые вы хотите отправить, оба являются простыми, вы можете умножить их и отправить продукт, а на сервере вычислить их, чтобы получить результат.

; p (вдохновленный неоднозначностью в вопросе)

1 голос
/ 13 марта 2011

Вы можете закодировать 2 16-разрядных числа в 32-разрядное число.Например:

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;
}
1 голос
/ 13 марта 2011

В каком диапазоне находятся ваши номера?Если они могут уместиться в 16 бит, то вы можете упаковать два из них в 32-битный int.Что-то вроде i = (n1 << 16) | (n2 &0xffff).

0 голосов
/ 13 марта 2011

Я думаю Союзы в C будет делать работу. Вы также можете перейти на битовые поля в C

0 голосов
/ 13 марта 2011

Предполагая, что вы хотите отправить 2 16-битных числа, вы можете сделать что-то вроде этого:

unsigned int a, b, toSend;
// Give a and b a value...
toSend = ( a << 16 ) | b;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...