2012-09-29 74 views
-1

我发现这在使用C编写的contiki的单播示例中。任何人都可以向我解释他们做了什么。处理结构c

感谢

#define MSG_LEN 20 
msg_header_t * header; 
uint8_t *data; 

packetbuf_clear(); 
header = (msg_header_t *)(packetbuf_dataptr()); 
data = (uint8_t *)(header + 1); 
random_data(data, MSG_LEN); 
hton_uint16(&header->data_len, MSG_LEN); 

packetbuf_set_datalen(sizeof(msg_header_t) + MSG_LEN); 
rimeaddr_t addr; 
addr.u8[0] = 2; 
addr.u8[1] = 0; 
if(!rimeaddr_cmp(&addr, &rimeaddr_node_addr)) { 
    unicast_send(&uc, &addr); 
} 

下面是一些关于细节

typedef struct { 
    unsigned char data[2]; 
} nw_uint16_t; 

typedef struct msg_header 
{ 
    NN_DIGIT r[NUMWORDS]; //NN_DIGIT = uint32_t, NUMWORDS = 6 
    NN_DIGIT s[NUMWORDS]; 
    nw_uint16_t data_len; 
} msg_header_t; 

inline uint16_t hton_uint16(void * target, uint16_t value); 

inline uint16_t ntoh_uint16(void * source); 

方法

inline uint16_t hton_uint16(void * target, uint16_t value) 
{ 
    uint8_t *base = target; 
    base[1] = value; 
    base[0] = value >> 8; 
    return value; 
} 
/*---------------------------------------------------------------------------*/ 
inline uint16_t ntoh_uint16(void * source) 
{ 
    uint8_t *base = source; 
    return (uint16_t)(base[0] << 8 | base[1]); 
} 
/*---------------------------------------------------------------------------*/ 
static void random_data(void *ptr, uint16_t len) 
{ 
    uint16_t i; 
    for(i=0; i<len; i++) { 
     srand(100); 
     ((uint8_t *)(ptr))[i] = 2; 
    } 
} 

packetbuf方法 http://dak664.github.com/contiki-doxygen/a01563.html#_details

+1

你的问题到底是什么? –

+0

解释我这些 packetbuf_clear(); header =(msg_header_t *)(packetbuf_dataptr()); data =(uint8_t *)(header + 1); random_data(data,MSG_LEN); – cdev

+0

你对C中的指针和指针有什么了解?请阅读一本关于C编程的好书。它会在几分钟内解释比我们更好的事情。 –

回答

0

从我能理解的内容:

packetbuf_dataptr()分配足够的内存来保存数据包头,数据长度和它的有效载荷。

header = (msg_header_t *)(packetbuf_dataptr());将指向标题的指针设置为该存储器数组的开头。

data = (uint8_t *)(header + 1);header + 1这意味着尽可能<address of header> + sizeof(msg_header_t)

random_data(data, MSG_LEN);提出的MSG_LEN字节一些随机数据到有效负载之后设置数据“有效负载”到第一存储器地址的开头。

hton_uint16(&header->data_len, MSG_LEN);以网络字节顺序将数据段的长度写入包头data_len字段。

packetbuf_set_datalen(sizeof(msg_header_t) + MSG_LEN);将标头与其有效载荷一起发送出去。

+0

非常感谢,这就是我需要的 – cdev

+0

@ user827918你应该接受答案(如果它已经记录了您的问题,请点击数字上方和下方的箭头)。 – Scooter