使用DDL结构读取ADTF 2文件的填充适配问题问询
处理ADTF文件中带填充的结构体数据映射问题
我来帮你拆解这个ADTF数据映射的麻烦——核心问题是结构体定义和实际数据间的填充字节干扰,而且所有目标字段值都应该是十进制41,咱们一步步理清楚:
问题背景梳理
- 读取ADTF文件块头后,块总大小96字节,减去32字节块头,实际数据段为64字节
- 定义的
NESTED_STRUCT结构体按DDL计算总长度仅43字节(tHeaderStruct12字节 +tSimpleStruct31字节),但实际数据有64字节,存在大量额外填充 - 所有提取的字段值预期为十进制41,需要推断填充位置并正确映射数据
格式化后的DDL结构
<stream description="streamid_2" name="NESTED_STRUCT" type="adtf.core.media_type"> <struct bytepos="0" name="tNestedStruct" type="tNestedStruct"/> </stream> <struct alignment="1" name="tNestedStruct" version="1"> <element alignment="1" arraysize="1" byteorder="LE" bytepos="0" name="sHeaderStruct" type="tHeaderStruct"/> <element alignment="1" arraysize="1" byteorder="LE" bytepos="12" name="sSimpleStruct" type="tSimpleStruct"/> </struct> <struct alignment="1" name="tHeaderStruct" version="1"> <element alignment="1" arraysize="1" byteorder="LE" bytepos="0" name="ui32HeaderVal" type="tUInt32"/> <element alignment="1" arraysize="1" byteorder="LE" bytepos="4" name="f64HeaderVal" type="tFloat64"/> </struct> <struct alignment="1" name="tSimpleStruct" version="1"> <element alignment="1" arraysize="1" byteorder="LE" bytepos="0" name="ui8Val" type="tUInt8"/> <element alignment="1" arraysize="1" byteorder="LE" bytepos="1" name="ui16Val" type="tUInt16"/> <element alignment="1" arraysize="1" byteorder="LE" bytepos="3" name="ui32Val" type="tUInt32"/> <element alignment="1" arraysize="1" byteorder="LE" bytepos="7" name="i32Val" type="tInt32"/> <element alignment="1" arraysize="1" byteorder="LE" bytepos="11" name="i64Val" type="tInt64"/> <element alignment="1" arraysize="1" byteorder="LE" bytepos="19" name="f64Val" type="tFloat64"/> <element alignment="1" arraysize="1" byteorder="LE" bytepos="27" name="f32Val" type="tFloat32"/> </struct>
格式化后的64字节原始数据
index = value (decimal) 0 = 3 1 = 43 2 = 0 3 = 0 4 = 0 5 = -57 6 = -120 7 = 31 8 = 0 9 = 0 10 = 0 11 = 0 12 = 0 13 = 0 14 = 0 15 = 0 16 = 0 17 = 41 18 = 0 19 = 0 20 = 0 21 = 0 22 = 0 23 = 0 24 = 0 25 = 0 26 = -128 27 = 68 28 = 64 29 = 41 30 = 41 31 = 0 32 = 41 33 = 0 34 = 0 35 = 0 36 = 41 37 = 0 38 = 0 39 = 0 40 = 41 41 = 0 42 = 0 43 = 0 44 = 0 45 = 0 46 = 0 47 = 0 48 = 0 49 = 0 50 = 0 51 = 0 52 = 0 53 = -128 54 = 68 55 = 64 56 = 0 57 = 0 58 = 36 59 = 66 60 = 0 61 = 0 62 = 0 63 = 0
分析与解决思路
1. 先明确ADTF的填充规则
ADTF结构体默认会按最大基本类型的字节数对齐(这里最大类型是8字节的tFloat64/tInt64),也就是说每个结构体或字段都会被填充到8字节的整数倍。比如:
tHeaderStruct原长12字节,会被填充到16字节(补4字节)tSimpleStruct原长31字节,会被填充到32字节(补1字节)
但这样总长度也才48字节,和实际的64字节仍有差距,说明整个数据块还额外填充了16字节(可能是ADTF的块对齐要求)。
2. 基于"所有值为41"的前提反向定位字段
我们可以把每个字段的预期字节序列列出来,在原始数据中匹配:
- 单字节字段(ui8Val):找单独的
41,原始数据索引1是41,可能是该字段(前面的3是填充字节) - 双字节字段(ui16Val):小端序列是
41 0,匹配索引30-31的41 0,正好对应值41 - 四字节字段(ui32Val、i32Val):小端序列是
41 0 0 0,匹配索引32-35、36-39、40-43这三段,对应两个四字节字段 - 八字节字段(i64Val):小端序列是
41 0 0 0 0 0 0 0,匹配索引40-47的41 0 0 0 0 0 0 0,对应i64Val=41 - 浮点数字段(f64Val、f32Val):41.0的双精度小端序列是
0 0 0 0 0 0 69 64,单精度是0 0 40 66,原始数据中没有完全匹配的序列,可能是数据笔误或填充位置覆盖了这些字段,建议用ADTF工具验证。
3. 快速验证方案
最省心的方法是用ADTF官方工具(比如ADTF DAT Viewer)直接打开文件,查看该流的媒体类型结构和字段实际位置,工具会自动处理填充字节,直接显示每个字段的数值,避免手动推断的误差。
内容的提问来源于stack exchange,提问作者Piotr Reszke
相关产品推荐
相关产品推荐

