【问题标题】:RIFF ICMT tag size doesn't seem to match dataRIFF ICMT 标签大小似乎与数据不匹配
【发布时间】:2018-09-07 07:46:07
【问题描述】:

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

RIFF 解析代码似乎一切正常,除了 ICMT 标签似乎在声明的大小之后有数据。幸运的是,它是时间戳,它对我的​​应用程序来说绝对是至关重要的一条信息。

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

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

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

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

【问题讨论】:

    标签: c# wav riff


    【解决方案1】:

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

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

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

    由于我遇到了无数不符合标准的文件,我只能说您的解析器也太天真了:它知道封装列表有多长,因此可以轻松检测不再适合的字段长度。并且可以忽略这样的垃圾。或者,在您的情况下,提供非常具体的选项“添加到最后一个字段”。

    【讨论】:

    • 最后我得到了制造商的回复,说这种行为是设计使然,所以我只是按照你的建议添加了特定选项“如果标签是这个,长度实际上是这个”。谢谢!
    • “按设计” - 询问制造商为什么他不希望任何软件能够正确解析他的文件。我的猜测:他只是不在乎。
    • 我的理论也是,它可以与他们自己的捆绑软件一起使用,虽然没有设置实际障碍,但他们并不真正关心如何简化第三方解决方案。
    猜你喜欢
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多