返回信息流各位好,请教一个c语言编程问题。
假设我构造的某种网络报文,其中有几个字段连续排列,总长为2字节(16bit),各个字段的名称和比特数如下
a 1
b 2
c 4
d 8
e 1
要求:方便操作各个字段(读取和写入),内存中的排布满足网络字节序要求(a在最低地址的最高bit部分,e在最高地址的最低bit部分)
我能想到的方法有两种:
1、定义为char[2],定义各种宏,掩码操作。缺点可读性差,不好维护。
2、定位为bitfield,优点是读写方便。缺点是要故意逆序定义,而且还要进行字节序翻转(htons)
我觉得这种问题应该有通用做法吧,特此请教各位~
这是一条镜像帖。来源:北邮人论坛 / cpp / #32181同步于 2009/11/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]网络协议中字段的填写方法
hobby
2009/11/26镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
第二种方法填写是方便,可是发送前还得把struct里面的内容根据2字节、4字节做网络字节序变换,有点儿不爽啊
【 在 jmpesp (垃圾|人渣|缅甸果敢第一司令) 的大作中提到: 】
: 貌似没啥通用的吧,你第2种方法就用的最多的
【 在 hobby 的大作中提到: 】
: 第二种方法填写是方便,可是发送前还得把struct里面的内容根据2字节、4字节做网络字节序变换,有点儿不爽啊
也就一个函数嘛..
用google的protobuf去序列化一下
缺点:引入第三方库...
【 在 hobby (hobby) 的大作中提到: 】
: 各位好,请教一个c语言编程问题。
: 假设我构造的某种网络报文,其中有几个字段连续排列,总长为2字节(16bit),各个字段的名称和比特数如下
: a 1
: ...................
关键是就没法用嵌套定义的结构体了,即使嵌套定义了,填写时候OK,发送之前要对包含bit field的子struct根据长度进行翻转
别人看到程序估计都会纳闷这里为什么翻转,而且可能把结构体定义直接拷贝过去用,然后发现有大小端错误……
【 在 jokerlee (Jackal The Dire) 的大作中提到: 】
: 也就一个函数嘛..
这个好像更麻烦了……
其实之前看过一个代码的方法可行,但是效率太差了,比如解析报文:先把报文粗分的字段(例如包头或者净荷)按bit拆开装到int型数组中(int型数组每个元素存放一个bit),这样对某些bit的处理就变为对数组某些连续元素的操作,虽然可读性好了很多,但是这个空间效率和时间效率损失太多了
【 在 PtwCJ (鲜的每日C|女共产党员的男朋友) 的大作中提到: 】
: 用google的protobuf去序列化一下
: 缺点:引入第三方库...
哦?就这样用就可以?
没有其他方法了吗?
【 在 ki (谁) 的大作中提到: 】
: 在驱动程序里第一种方法用得灰常多
: 在应用程序里第二种方法用得灰常多