gpt4 book ai didi

python - 使用 Python 解析 IFF 样式数据

转载 作者:行者123 更新时间:2023-11-30 14:55:16 26 4
gpt4 key购买 nike

我有一个 IFF 样式的文件(见下文),我需要在 Python 中检查其内容。

https://en.wikipedia.org/wiki/Interchange_File_Format

我可以使用以下代码迭代该文件

from chunk import Chunk

def chunks(f):
while True:
try:
c=Chunk(f, align=False, bigendian=False)
yield c
c.skip()
except EOFError:
break

if __name__=="__main__":
for c in chunks(file("sample.iff", 'rb')):
name, sz, value = c.getname(), c.getsize(), c.read()
print (name, sz, value)

现在我需要解析不同的值。我使用 Python 的“struct”模块取得了一些成功,如下所示解包不同的字段

struct.unpack('<I', value)

struct.unpack('BBBB', value)

通过尝试结构模块文档中显示的不同格式字符

https://docs.python.org/2/library/struct.html

这适用于一些更简单的字段,但不适用于更复杂的字段。这都是非常反复试验的。我需要的是一些系统的方法来解压缩不同的值,一些了解或检查它们所代表的数据类型的方法。我不是 C 数据类型专家。

有什么想法吗?非常感谢。

<小时/>
SVOXVERS  BVER BPM }SPEDTGRDGVOL`NAME2017-02-15 16-38MSCLMZOOMXOFMYOFLMSKCURLTIMESELSLGENPATNPATTPATLPDTAa � 1pQ  10 `q !@QP! 0A �`A PCHNPLIN PYSZ PFLGPICO �m�!�a��Q�1:\<<<<:\�1�Q��a�!�mPFGCPBGC���PFFFPXXXPYYYPENDSFFFCSNAM OutputSFINSRELSXXXDSYYYhSZZZSSCLSVPRSCOL���SMICSMIB����SMIP����SLNK����SENDSFFFISNAM FMSTYPFMSFINSRELSXXX�SYYY8SZZZSSCLSVPRSCOL��SMICSMIB����SMIP����SLNKCVAL�CVAL0CVAL�CVALCVALCVALCVALCVALGCVALnCVAL\CVALCVAL&CVALoCVALDCVALCVALCVALCMID������������������SENDSFFFQSNAM EchoSTYPEchoSFINSRELSXXX�SYYY SZZZSSCLSVPRSCOL��SMICSMIB����SMIP����SLNK����CVALCVALCVAL�CVALCVALCVALCMID0������SENDSFFFQSNAM ReverbSTYPReverbSFINSRELSXXX\SYYY�SZZZSSCLSVPRSCOL��SMICSMIB����SMIP����SLNK����CVALCVALCVAL�CVAL�CVALCVALCVALCVALCVALCMIDH���������SENDSENDSENDSENDSEND

最佳答案

如果它确实是一个 IFF 文件,则需要打开对齐和大端字节序,并且该文件将包含一个 FORM block ,该 block 又包含 FORM 类型,例如 SVOX 和内容 block 。 (或者它可以包含 LISTCAT 容器 block 。)

IFF block 具有:

  • 四字符 block 类型代码
  • 四字节大端整数:长度
  • length 数据字节数
  • 如果长度为奇数,则用于对齐的填充字节

这记录在“EA IFF 85”中。请参阅the "EA IFF-85" Repository原始 IFF 文档。 [我写的。]

某些文件格式(例如 RIFF 和 PNG)是 IFF 设计的变体,不符合 IFF 标准的应用程序。它们改变了 block 格式细节,这就是 Python's Chunk reader library 的原因让您选择对齐方式、字节序以及何时递归成 block 。

通过在十六进制/ascii 转储中查看文件并映射 block 跨度,您应该能够推断出它是使用大端还是小端 length 字段,无论每个字段都是奇数-length chunk 后面跟着一个填充字节,用于对齐,以及 block 内是否有 block 。

现在进入正文。 block 的类型表示其内容的格式和语义。这些内容可以是简单的 C 结构,也可以包含可变长度字符串。与 JSON 和 TIFF 不同,IFF 本身不提供该结构级别的元数据。

所以尝试查找该文件格式的文档(SVOX?)。

否则尝试对数据进行逆向工程。如果将示例数据放入生成这些文件的应用程序中,则可以尝试特殊情况,在文件中查找预期值,仅更改一个参数,然后查找文件中发生的更改。

最后,您的代码应该调用c.close()c.close() 将为您调用 c.skip() 并处理 block 关闭,其中包括随后尝试读取 block 的安全检查。

关于python - 使用 Python 解析 IFF 样式数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46023012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com