将一个结构“连接”到一个char数组中

时间:2011-06-02 07:14:00

标签: c casting struct concatenation

我有一个在我的互联网应用程序中使用的结构,如下所示:

struct query {
     ushort trans_id;
     ushort flags;
     ushort opcode;
     ushort content_length;
     char content[512];
};

基本上,我只是试图采用这种结构并将其转换为要发送的“数据包”。它必须具有相应的长度和一切。所以;如果我能,我会喜欢: struct query q;

q.trans_id = 0x5544;
q.flags = 0x0000;
q.opcode = 0x0010;
q.content_length = 0x0001;
q.content[0] = '\0'; //I would want my packet to end up looking like this, when outputted to the socket:
//\x55\x44\x00\x00\x00\x10\x00\x01\x00
//and yes, it's going to be stored in a char buffer, but I'm not using any functions that will trim off any of the things past the null!

我觉得这是一个相对简单的问题,可以通过投射我的数据类型来回答,但我认为它比这更难。

我也尝试过使用sprintf,但它会将我的空值变成实际的0,所以0x0000会变成2'0'ASCII字符!

2 个答案:

答案 0 :(得分:2)

如果要将其作为数据包发送,则需要注意字节顺序(htons)。创建自己的功能,创建“数据包”。

  • 创建一个足够大的缓冲区(静态字符数组应该可以正常运行)
  • 将每个元素复制(memcpy)。不要忘记htons

您可能只想write struct到套接字。 你不应该这样做,因为不能保证接收机器上的字段布局是相同的(填充?)。

答案 1 :(得分:0)

您确实可以简单地将指向结构的指针转换为char *,例如:

#include <stdlib.h> /* for size_t */

....

struct query q;
/* fill in the struct ... */
char *packet = (char *)(&q);
size_t packet_size = sizeof(struct query);

如果您希望数据包大小修剪查询结构的内容,则必须计算差异(例如,通过在内容上使用strnlen并减去差异)

编辑:或者修剪你可以做:

int packet_size = (&(q.content[0]) + strnlen(q.content, 512)) - &q;