我试图在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;
现在我想使用struct并在变量中保存十六进制值。
int main()
{
ipheader iph;
iph.ip_v='\x4';
iph.ip_hl='\x5';
iph.ip_tos='\x00';
return 0;
}
如何将 103C写入iph.ip_len ?这种结构是存储IP头的好方法吗?
答案 0 :(得分:2)
如何使用iphdr结构?
除此之外,您应该注意关于字节顺序(请参阅ntohl和htonl函数),具体取决于您要对其中的数据执行的操作(您没有说)。另请参阅why endianess matters among bits inside a byte?关于iphdr中的endianess。
为了自己编写值,您可以使用您使用的标准/编译器允许的任何格式,例如:二进制文字,如果您使用正确的GCC版本与适当的标志,或八进制,或十进制,或字符数组,或...
以下是不同文字格式的一些示例:
十六进制:0x103C
字符数组:(char *){ 10, 60 }
或(char *){ 10, '<' }
八进制:010074
二进制:0b1000000111100
如果你不在不同类型之间移动值或者用它们做一些时髦的数学运算,你甚至不需要演员 - 否则编译器会将这些值解释为int
,这可能是一个你的问题,特别是因为签名不同。在这种情况下,只需要前缀(uint16_t)
或您需要的任何内容(您应该使用系统中定义的相同类型 - 请参阅我的答案顶部的iphdr建议 - 或固定长度定义,以避免出现可移植性问题或未来更新的问题)
答案 1 :(得分:0)
您只需为其指定值:
iph.ip_len = (unsigned short int)0x103C;
您实际分配为其他角色的其他人。我不确定你是不是有意。
因此,在iph.ip_v='\x4'
中,'\x4'
实际上表示一个字符,然后将其分配给ip_v
成员(截断为4位)。但你可以写iph.ip_v=0x04
。
答案 2 :(得分: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