RIFF ICMT 标签大小似乎与数据不匹配

RIFF ICMT tag size doesn't seem to match data

我正在尝试读取存储在噪声监测设备生成的 WAV 文件上的 ICMT 标签中的数据。

RIFF 解析代码似乎都工作正常,除了 ICMT 标签似乎有声明大小之后的数据。幸运的是,它是时间戳,这是我的应用程序绝对重要的信息。

SYN 是十六进制 16,其大小为 22,最多包括时间戳之前的 NUL。监视器文档没有帮助;它说标签包括时间,但他们的例子也有同样的问题。

它是封闭列表中的最后一个标签,列表的大小确实包括它 - 这是否意味着它不需要块 ID?我正在努力寻找像样的 RIFF 文档,但我找不到任何表明情况如此的信息;我也看不出如何确定它是最后一个块,所以知道在没有块 ID 的情况下读取它。

或者,ICMT 注释块是文件中的最后一个内容 - 这是特例吗?我可以通过读取从声明长度 ICMT 末尾到文件末尾的所有内容来获取时间,并假设它始终有效吗?

当前的解析器行为是在作为块 ID + 大小的通道/dB 信息之后读取它,然后抱怨文件中没有足够的数据来满足请求。

不,它仍然需要自己的 ID。不,作为文件中的最后一件事也不是特例。您在此处显示的内容格式错误。

您当前的解析器错误正确,因为接下来再次预期的是 4 字节 ID,后跟 4 字节长度。潜在的 ID _10: 是未知的,会被跳过,但是将 51:4 解释为 DWORD 的课程长度会带来麻烦。

设备是罪魁祸首。您是否有其他使用 NULL 字节的 INFO 字段?如果不是,那么我认为该设备足够天真,可以将 NULL 视为字符串的结尾,尽管它自己生成了具有多个 NULL 的字符串。

因为我遇到了无数不符合标准的文件,我只能说你的解析器也太天真了:它知道封装列表有多长,因此可以很容易地检测到不再适合的字段长度。并且可以忽略那样的垃圾。或者,根据您的情况,提供非常具体的选项 "add to last field".