嵌入式开发经验案例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.无符号数运算及与有符号数比较。
在开发流媒体客户端时,接收rtp报后需要比较其序号与期望得到序号相差是否超过范围:
nPackSeq - nNextWantedRTPSeq与 256 的大小。rtp包序号是一个2字节无符号证书,从0递增到65535,再递增时则变为0。
接收方期望得到的下一个包序号nNextWantedRTPSeq为65535时,发送方发送一个序号为65535的rtp 包然后包序号回卷到0开始,由于网络丢包,序号65535的rtp包以及接下来从0到256的rtp包都丢失了,于
是接收方收到了nPackSeq为257的包,按照上述nPackSeq - nNextWantedRTPSeq自动为无符号数的理论,(nPackSeq - nNextWantedRTPSeq>256 )的值应该是“true”,但在程序运行时发现并非如此,(nPackSeq - nNextWantedRTPSeq>256 )值为“false”。
*二、案例分析和解决
问题的根源在于rtp包序号是一个unsigned short int类型,导致案例描述中“nPackSeq - nNextWantedRTPSeq自动为无符号数”不成立。如果是两个unsigned int类型的变量作差,结果为unsigned int类型是成立的。在VC6.0中测试如下:
1. unsigned int变量作差
unsigned intnNext = 256;
unsigned intnNow = 1000;
std::cout<< ( nNext-nNow>0 ) < 2. unsigned short int变量作差 unsigned short intnNext = 256; unsigned short intnNow = 1000; std::cout<< ( nNext-nNow>0 ) < 解决问题的方式很简单,对两个unsigned short int变量的运算结果作强制转换即可,把nPackSeq - nNextWantedRTPSeq>256改为unsignedshortint(nPackSeq - nNextWantedRTPSeq) >256。 2.内存地址对齐对数据拷贝效率的影响 3.结构体字节对齐的问题