BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #32181同步于 2009/11/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]网络协议中字段的填写方法

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