2016-12-03 10 views
1

я иметь эту структуру:скопировать на структуру с помощью динамических строк в буфере с

typedef struct 
{ 
    auth_header header; // another struct 
    uint8_t action; 
    uint8_t priv_lvl; 
    uint8_t authen_type; 
    uint8_t service; 
    uint8_t user_len; 
    uint8_t port_len; 
    uint8_t rem_addr_len; 
    uint8_t data_len; 
    char *user; 
    char *port; 
    char *rem_addr; 
    char *data; 

} auth_start; 

и я хочу, чтобы создать буфер и вставить данные в нем, так что я могу отправить эти данные на моем сервере.

  1. im не уверен, какой тип буфера должен быть (uint8_t/char/auth_start).
  2. Я не уверен, как это сделать, должен ли я копировать каждое поле 1 на 1 с помощью memcpy()? или есть другой способ?

спасибо! :)

ответ

1

Я не уверен, что тип буфера должен быть

Любой тип байт будет делать. uint8_t - хороший выбор, учитывая типы полей без указателей в вашем struct - все uint8_t.

Я не знаю, как я должен это сделать, я должен скопировать каждое поле по одному с memcpy()

Во-первых, вам нужно выяснить, сколько памяти ваши потребности буфера. Вы выделяете эту память и копируете часть без указателей с назначением. Наконец, вы memcpy данных с четырех указателей:

auth_start s = ... 
// Add 8 for the initial 8 members 
uint8_t *buf = malloc(8+s.user_len+s.port_len+s.rem_addr_len+s.data_len); 
uint8_t p = buf; 
// Copy the initial fields 
*p++ = s.action; 
*p++ = s.priv_lvl; 
... // And so on for the remaining members 
// Copy pointer-based members 
memcpy(p, s.user, s.user_len); 
p += s.user_len; 
memcpy(p, s.port, s.port_len); 
p += s.port_len; 
... // And so on for the remaining pointer members 
+0

спасибо большое! и как я могу проверить, хорош ли буфер? Мне нужно сбросить p до начала auth и распечатать его в цикле? – phantttom

+0

@phantttom фактический указатель - buf, а не p. Сбросьте p обратно в buf, если вы хотите обработать следующую структуру. – dasblinkenlight

+0

благодаря вашему решению работает отлично! :) – phantttom