2013-10-20 1 views
1

У меня есть проект колледжа, где нужно преобразовать int в буфер char. Мне нужно использовать memcpy, но когда я копирую значения, это не работает, потому что msg_buf все еще пуст. У меня есть некоторые ограничения: - Мне нужно использовать memcpy, потому что мой учитель проверит мой код как memcmp (msg_str, & opcode, 2) == 0).Сообщение для буфера в C

Вот мой код:

int message_to_buffer(struct message_t *msg, char **msg_buf){ 
    int opcode = htons(msg->opcode); 
    int c_type = htons(msg->c_type); 
    int result; 
    int buffer = sizeof(opcode) + sizeof(c_type); 

    switch(msg->c_type){ 

     case CT_RESULT: 

      result = htonl(msg->content.result); 
      buffer += sizeof(result); 
      *msg_buf = (char*)malloc(sizeof(char) * 12); 

      if(msg_buf == NULL) 
       return -1; 
      memcpy(*msg_buf,&opcode,sizeof(opcode)); 

      break; 

    }; 

    return buffer; 
} 

Что здесь не так?

+0

Можете ли вы уточнить, как он не работает? – icktoofay

+0

Значение кода операции не копируется в буфер. –

+0

Возможно, вы должны отредактировать свой комментарий о том, что это проект колледжа, поэтому люди, которые отвечают, знают об ограничениях. На данный момент все, что вы сделали, это почтовый код и сказать «он не работает». –

ответ

1

В частности, вам необходимо скопировать шорты как шорты, а не ints. sizeof (short)! = sizeof (int) (обычно, в зависимости от архитектуры):

int message_to_buffer(struct message_t *msg, char **msg_buf){ 
    short opcode = htons(msg->opcode); 
    short c_type = htons(msg->c_type); 
    int result; 
    char* buffer = NULL, *buf_start=NULL; 
    *msg_buf = NULL; 

    switch(msg->c_type){ 

     case CT_RESULT: 

      result = htonl(msg->content.result); 
      buffer = (char*)malloc(sizeof(char) * 12); 

      if (buffer == NULL) 
       return -1; 
      buf_start = buffer; 
      memcpy(buffer,&opcode,sizeof(opcode)); // sizeof(short) == 2; sizeof(int) == 4 
      buffer += sizeof(opcode); 
      memcpy(buffer,&c_type,sizeof(c_type)); // sizeof(short) == 2; sizeof(int) == 4 
      buffer += sizeof(c_type); 
      memcpy(buffer,&result, sizeof(result)); 
      buffer += sizeof(result); 
      *msg_buf = buf_start; 
      break; 

    }; 

    return buffer - buf_start; 
} 
+0

Это работает! Большое спасибо за помощь. –

0

Почему бы вам не использовать функцию itoa для преобразования int в char*? Поэтому вы заменяете memcpy функцией itoa.

Ссылка: http://www.cplusplus.com/reference/cstdlib/itoa/

[EDIT] Если ваш компилятор не поддерживает itoa, вы можете использовать вместо sprintf.

+0

itoa не является стандартной функцией – sukhvir

+0

Поскольку мне нужно отправить эту целую структуру:
struct message_t { \t short opcode; \t short c_type; \t union content_u { \t \t struct entry_t * entry; \t \t знак * ключ; \t \t char ** ключи; \t \t struct data_t * значение; \t \t int result; \t} содержание; }; –

+0

Я не совсем понимаю. Итак, что произойдет, если вы измените 'memcpy (* msg_buf, & opcode, sizeof (код операции)),' to 'sprintf (* msg_buf,"% d ", opcode);'? – rcs

1

Я думаю, ваша проблема может заключаться в том, что вы вызываете htons() на int. htons() предназначен для использования со значениями типа short, поэтому вы можете потерять верхние 16 бит вашего кода msg-> opcode и msg-> c_type. Попробуйте вместо этого заменить htons() на htonl().

Кроме того, похоже, что вы выделяете 12-байтовый буфер с помощью malloc(), но только записываете в него 4 байта, оставляя последние 8 байтов его неинициализированными/неопределенными. Это намеренно?

+0

Я попробовал с htonl(), и результат был таким же. Я выделяю 12-байтовый буфер, потому что мне нужно скопировать больше двух int's –

Смежные вопросы