Как я могу сохранить 16-битное число в двух байтах массива символов? - PullRequest
2 голосов
/ 30 ноября 2011

Мне нужно сохранить номер порта в массиве char, чтобы его можно было записать в сокет. Протокол указывает, что байты 25 и 26 предназначены для номера порта. Я пробовал разные вещи, но теперь я должен сохранить номер:

//msg is declared as char msg[50];
msg[25] = (uint8_t) (UDP_PORT / 256);
msg[26] = (uint8_t) (UDP_PORT % 256);

Затем, чтобы восстановить номер на другой стороне сокета, у меня есть:

uint8_t msb, lsb;
msb = msg[25];
lsb = msg[26];
int port =  msb * 256 + lsb;

Любые советы будут с благодарностью.

Ответы [ 4 ]

1 голос
/ 01 декабря 2011

Большинство протоколов, которые отправляют целое число в многобайтовом двоичном формате, отправляют значение в сетевом порядке байтов для согласованности через границы платформы. Используйте функции htons() и ntohs() API сокета для преобразования целого числа между порядком байтов хоста (который используется на локальной машине) и порядком байтов в сети, например:

Отправка:

uint16_t *ptr = (uint16_t*) &msg[25];
*ptr = htons(UDP_PORT);

Принимающий:

uint16_t *ptr = (uint16_t*) &msg[25]; 
int port = ntohs(*ptr); 
1 голос
/ 30 ноября 2011

Вы пробовали, сдвигали и / или выполняли операции?

msg[25] = (uint8_t) ((UDP_PORT >> 8) & 0xff);
msg[26] = (uint8_t) (UDP_PORT & 0xff);

, а затем

uint8_t msb, lsb;
msb = msg[25];
lsb = msg[26];
int port =  (msb << 8) | lsb;

Вы уверены, что UDP_PORT является 16-битным значением? ... потому что, если он 32-битный, устройство не будет работать для изоляции msb. Конечно, побитовые операции будут.

0 голосов
/ 01 декабря 2011

Вы можете сделать это также .... например, я показываю как ... здесь я взял неподписанный буфер, вы можете изменить его в соответствии с вашими требованиями ...

     unsigned char upBuff[3] = {0};
     upBuff[1] = att_seq_no & 0xff;
     upBuff[0] = att_seq_no >> 8;
     printf("Updated Sequence Number(For Attendance Record Table)(IN HEXA)\
                     Now is(IN HEXA) : %02x %02x\n", upBuff[0], upBuff[1]);
0 голосов
/ 30 ноября 2011

Может быть, это то, что вы хотите:

/* if UDP_PORT is a variable, and local machine is big-endian */
unsigned char *ptr = (unsigned char *)&UDP_PORT;
msg[25] = *ptr;
msg[26] = *(ptr + 1);

затем:

/* if msg is a address variable */ 
unsigned short *ptr = (unsigned short *)(msg + 25);
int port = 0x0000FFFF & (unsigned short)*ptr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...