1

我正在尝试在 C 中创建一个 IP 标头。

typedef struct header
{
    //IP-Header
    unsigned char ip_v:4, ip_hl:4;/* this means that each member is 4 bits */
    unsigned char ip_tos;       //1 Byte
    unsigned short int ip_len;  //2 Byte
    unsigned short int ip_id;   //2 Byte
    unsigned short int ip_off;  //2 Byte
    unsigned char ip_ttl;       //1 Byte
    unsigned char ip_p;         //1 Byte
    unsigned short int ip_sum;  //2 Byte
    unsigned int ip_src;        //4 Byte
    unsigned int ip_dst;        //4 Byte


} __attribute__((packed)) ipheader;

现在我想使用结构并将十六进制值保存在变量中。

int main()
{
    ipheader iph;

    iph.ip_v='\x4';
    iph.ip_hl='\x5';
    iph.ip_tos='\x00';

    return 0;
}

如何将103C 写入 iph.ip_len?这种结构是存储 IP 标头的好方法吗?

4

3 回答 3

2

使用iphdr结构怎么样?

除此之外,您应该注意字节顺序(请参阅ntohlhtonl函数),具体取决于您要对其中的数据做什么(您没有说)。另请参阅为什么字节顺序在字节内的位之间很重要?关于 iphdr 中的字节序。

对于编写值本身,您可以以您使用的标准/编译器允许的任何格式执行此操作,例如二进制文字,如果您使用带有适当标志的正确 GCC 版本,或八进制,或十进制,或字符数组,或...

以下是不同文字格式的一些示例:

十六进制:0x103C

字符数组:(char *){ 10, 60 }(char *){ 10, '<' }

八进制:010074

二进制:0b1000000111100

如果您不在不同类型之间移动值或对它们进行一些时髦的数学运算,您甚至不需要强制转换 - 否则编译器会将值解释为int可能对您来说是个问题,尤其是因为不同的签名。在这种情况下,只需添加前缀(uint16_t)或您需要的任何内容(您应该使用系统中定义的相同类型 - 请参阅我的答案顶部有关 iphdr 的建议 - 或固定长度定义,以避免可移植性问题或未来更新的问题)

于 2013-10-13T14:22:16.397 回答
0

您可以将值分配给它:

iph.ip_len = (unsigned short int)0x103C;

您实际指定为角色的其他人。我不确定这是不是你的意图。

所以在 中iph.ip_v='\x4''\x4'实际代表一个字符,然后分配给ip_v成员(截断为 4 位)。但你可以只写iph.ip_v=0x04.

于 2013-10-13T14:12:59.400 回答
0

利用:

unsigned char ip_hl:4, ip_v:4;

或者

int ip_vhl; // version and header togather
#define IP_HL(ip) (((ip)->ip_vhl) & 0x0f) //split header length
#define IP_V(ip) (((ip)->ip_vhl) >> 4) //split IP version

于 2014-02-27T07:51:21.127 回答