Chinaunix

标题: 如何将一个结构体中的所有成员的内容一次读出来 [打印本页]

作者: caocao152    时间: 2009-03-07 21:40
标题: 如何将一个结构体中的所有成员的内容一次读出来
有没有办法将结构体中的所有成员的内容一次读出来?
作者: MMMIX    时间: 2009-03-07 22:14
原帖由 caocao152 于 2009-3-7 21:40 发表
有没有办法将结构体中的所有成员的内容一次读出来?

有。
作者: maowang0021    时间: 2009-03-08 20:26
有,
最好具体点
作者: MMMIX    时间: 2009-03-08 21:51
原帖由 maowang0021 于 2009-3-8 20:26 发表
有,
最好具体点

没问题,前提是楼主能把问题说具体点
作者: caocao152    时间: 2009-03-08 22:36
没问题,前提是楼主能把问题说具体点


我要将一个抓到的数据包进行匹配,原来的做法是把数据按长度截取后放入指针数组中,然后在拿赋好值的一个指针数组去逐个进行比较,但主管说要用结构体来做,感觉用结构体的话比较麻烦,不知道有没有办法快速读出结构体中的所有成员值。不知道用结构体和用指针数组哪个好,各有什么优点?
结构体中成员变量在内存中的存放顺序应该是按定义时候的顺序存放的吧?那样的话应该可以根据偏移去读,那和数组操作应该挺类似的吧?之前看usb驱动模块的时候好象有点印象,但不是太清楚。
作者: kissGNU    时间: 2009-03-09 09:03
原帖由 caocao152 于 2009-3-8 22:36 发表


我要将一个抓到的数据包进行匹配,原来的做法是把数据按长度截取后放入指针数组中,然后在拿赋好值的一个指针数组去逐个进行比较,但主管说要用结构体来做,感觉用结构体的话比较麻烦,不知道有没有办法快速 ...



使用结构体就不需要一个一个给指针数组赋值了。
可以这么做。但可能要考虑结构体定义字节对齐问题,两端要一致。
作者: MMMIX    时间: 2009-03-09 10:32
原帖由 caocao152 于 2009-3-8 22:36 发表

我要将一个抓到的数据包进行匹配,原来的做法是把数据按长度截取后放入指针数组中,然后在拿赋好值的一个指针数组去逐个进行比较,

干嘛不直接用 memcmp?

不知道有没有办法快速读出结构体中的所有成员值。

读出来干嘛?要比较的话,一般情况下还是得逐个成员的比较;如果不存在 padding,那还不如直接用 memcmp 呢。

结构体中成员变量在内存中的存放顺序应该是按定义时候的顺序存放的吧?那样的话应该可以根据偏移去读,那和数组操作应该挺类似的吧?

Both are yes.
作者: yidou    时间: 2009-03-09 11:44
原帖由 MMMIX 于 2009/3/9 10:32 发表
干嘛不直接用 memcmp?


94. 可以按楼上所说, 直接做memcpy and memcmp操作
作者: FreeB_U    时间: 2009-03-09 13:41
memcopy不就得了吗
作者: banggou    时间: 2009-03-12 09:47
我觉得确实按LS诸位说的 应该没有问题啊
作者: duanjigang    时间: 2009-03-12 14:17
还是不要拷贝的好,现在不是流行零拷贝技术么?:wink:
直接拿到地址,如果基地址正确的话,用一个结构体指针指到这个地址,然后解析结构体,顺便就把数据取出来了。
一般这种数据包分析的应该都是对内存进行只读操作吧,目的无非就是分析出协议变量等信息。
作者: yidou    时间: 2009-03-12 14:35
标题: 回复 #11 duanjigang 的帖子
如果只读操作, 11楼说得极是.
作者: caocao152    时间: 2009-03-13 08:39
原帖由 duanjigang 于 2009-3-12 14:17 发表
还是不要拷贝的好,现在不是流行零拷贝技术么?:wink:
直接拿到地址,如果基地址正确的话,用一个结构体指针指到这个地址,然后解析结构体,顺便就把数据取出来了。
一般这种数据包分析的应该都是对内存进行 ...

有道理,可是要如何解析这个结构体呢?是按结构体成员的偏移一个个去比较么?
能不能具体点?最好能举个例子分析下,多谢了。
作者: yidou    时间: 2009-03-13 09:06
原帖由 caocao152 于 2009/3/13 08:39 发表

有道理,可是要如何解析这个结构体呢?是按结构体成员的偏移一个个去比较么?
能不能具体点?最好能举个例子分析下,多谢了。


把首地址(指针) 强制转化成"指向结构体的指针", 就可以按结构体来索引成员变量.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2