Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python解析IFF样式的数据_Python_C - Fatal编程技术网

使用Python解析IFF样式的数据

使用Python解析IFF样式的数据,python,c,Python,C,我有一个IFF样式的文件(见下文),我需要用Python检查其内容 我可以使用以下代码遍历该文件 from chunk import Chunk def chunks(f): while True: try: c=Chunk(f, align=False, bigendian=False) yield c c.skip() except EOFError:

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

我可以使用以下代码遍历该文件

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 module文档中显示的不同格式字符

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

有什么想法吗?非常感谢



SVOXVERS BVER BPM}SPEDTGRDGVOL`NAME2017-02-15 16-38msclmzoomxofmyflmskcurltimeslslgenpatnpattpatlpdtaa� 1pQ 10`q@QP!0A�`PCHNPLIN-PYSZ-PFLGPICO�M�!�A.��Q�1:\如果它确实是一个IFF文件,它需要对齐并打开big-endian,并且该文件将包含一个
表单
块,该块依次包含表单类型,如
SVOX
和内容块。(或者它可以包含
列表
CAT
容器块。)

IFF块具有:

  • 四个字符的块类型代码
  • 四字节大端整数:
    length
  • 长度
    数据字节数
  • 如果
    长度
    为奇数,则用于对齐的填充字节
这记录在“EA IFF 85”中。有关原始IFF文档,请参阅。[我写的。]

一些文件格式如RIFF和PNG是IFF设计的变体,不符合IFF标准的应用。它们会改变块格式的细节,这就是为什么可以选择对齐方式、endian以及何时递归到块中

通过在十六进制/ascii转储中查看文件并映射块跨度,您应该能够推断它使用的是大端还是小端
length
字段,每个奇数长度块后面是否有一个pad字节用于对齐,以及块中是否有块

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

因此,请尝试查找文件格式(
SVOX
?)的文档

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


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

bigendian=False
您确定吗?那些是阿米加的,对吗?应该是big endian,如果你这么说的话。我不是C数据类型专家。感激地收到所有意见:-)我想回答,但这个问题很难回答。它没有因为二进制输入而变得困难的
struct.unpack('BBBB', value)
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