【发布时间】:2015-02-26 10:12:53
【问题描述】:
我有一些 mpeg ts 位域,例如传输流包:
struct ts_package_header_s {
unsigned int continuity_counter :4;
unsigned int adaptation_field_control :2;
unsigned int transport_scrambling_control :2;
unsigned int PID :13;
unsigned int transport_priority :1;
unsigned int payload_unit_start_indicator :1;
unsigned int transport_error_indicator :1;
unsigned int sync_byte :8;
};
struct ts_package_s {
struct ts_package_header_s ts_header;
unsigned char ts_body[TS_BODY];
};
union ts_package_u {
struct ts_package_s ts_package;
unsigned char bytes[TS_PACKAGE];
};
在我的源代码中,我初始化了标头结构:
pat_package_header.sync_byte = 0x47;
pat_package_header.transport_error_indicator = 0;
pat_package_header.payload_unit_start_indicator = 1;
pat_package_header.transport_priority = 0;
pat_package_header.PID = PAT_PID;
pat_package_header.transport_scrambling_control = 0;
pat_package_header.adaptation_field_control = 1;
pat_package_header.continuity_counter = 0;
比我创建 ts_packag 联合
union ts_package_u package;
package.ts_package.ts_header = pat_package_header;
比我填充 ts_body 数组。 当我将此包写入文件时。我得到了向后数组:
10 00 40 47 XX XX XX.. instead of 47 40 10 00 XX XX XX..
我尝试将我的结构转换为 char* 而不是使用 union,但得到了相同的结果。
错在哪里?谢谢。
【问题讨论】:
-
您已将
sync_byte声明为结构中的最后一个成员,现在您想知道它不是第一个。 -
@mch 如果我向后移动这个结构,我将得到 '47 02 00 04' 而不是 '47 40 10 00'
-
位域没有可移植的表示形式,您的编译器可以随意布置它们。如果您需要匹配现有的数据布局,请不要使用位域。