c / c ++ как конвертировать short в char - PullRequest
3 голосов
/ 14 марта 2010

Я использую MS C ++. Я использую структуру, как

    struct header   {
        unsigned port : 16;
                unsigned destport : 16;
        unsigned not_used : 7;
        unsigned packet_length : 9;


    };
struct header HR;

вот это значение заголовка, которое мне нужно поместить в отдельный массив символов.

я сделал memcpy(&REQUEST[0], &HR, sizeof(HR));

но значение packet_length не отображается должным образом.

как если бы я назначал HR.packet_length = 31; я получаю -128 (в пятом байте) и 15 (в шестом байте).

если вы можете помочь мне с этим или если это более элегантный способ сделать это.

спасибо

Ответы [ 2 ]

2 голосов
/ 14 марта 2010

Похоже на ожидаемое поведение вашей структуры, поскольку вы определили, что packet_length имеет длину 9 бит. Таким образом, младший бит его значения уже находится в пятом байте памяти. Таким образом, значение -128, которое вы видите там (поскольку старший бит 1 в знаковом символе интерпретируется как отрицательное значение), а значение 15 - это то, что осталось в 6-м байте.

Биты памяти выглядят так (в обратном порядке, т. Е. От старшего к младшему):

     byte 6    |     byte 5    | ...
0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 
 packet_length   |   not_used  | ...

Обратите также внимание, что этот подход может быть не переносимым, поскольку порядок байтов внутри многобайтовых переменных зависит от платформы (см. endianness ).

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

1 голос
/ 14 марта 2010
struct header   {
  unsigned port : 16;
  unsigned destport : 16;
  unsigned not_used : 7;
  unsigned packet_length : 9;
};

int main(){
  struct header HR = {.packet_length = 31};
  printf("%u\n", HR.packet_length);
}

$ gcc new.c && ./a.out
31


Обновление:

Теперь я могу печатать это значение напрямую, используя атрибут в структуре. Но мне нужно отправить эту структуру по сети, и я использую Java.

В этом случае используйте массив символов (длина 16 + 16 + 7 + 9) и выполните синтаксический анализ на другой стороне, используя Java.
Размер массива будет меньше, чем struct, и в одном MTU может быть возможна дополнительная упаковка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...