描述:这个问题是在研究TS包头解析时遇到的用两种方式取TS包头,但结果不同
1. 使用正常顺序方式定义TS包头结构体然后将TS包头数据拷贝到包头结构体中。
2. 使用正常顺序方式定义TS包头结构体使用buffer存储TS包头,然后通过位移过滤方式将值赋给TS包头结构体的成员
结果:程序1:错误,程序2和3:正确
主要分析点昰程序1和程序3的区别,而程序2是一种繁琐但能保证正确性的实现方式所以没有仔细分析程序2。
1.首先考虑到可能是由于大小端的造成的,但是仔细分析后发现这是明显的单字节内数据错误问题而大小端影响的是多字节的排列顺序。
2.其次仔细分析了两种数据的结构的数據内存布局,发现是由于处理器定义字节的顺序是从右向左的也就是说低位在最右边。如下图所示:
程序1的内存布局:当结构体位域成員不是字节对齐的时候就出现了错误。
程序3的内存布局:使用倒序巧妙地解决了处理器从右向左的访问顺序对程序造成的影响
总结:通过这次的问题,搞明白了3个概念C语言赋值的位域,大小端处理器数据访问顺序。也掌握了一种更快速地解析数据包的方法