Windowsアニメーションカーソル(.ani)のRIFFヘッダー構造を解析するサンプルコードです。実行するとシグネチャとチャンクのデータサイズ、RIFFまたはLISTの場合はフォーム/リストタイプを出力します。
RIFFファイルやaniファイルの構造はソース中コメントのURLを参考にしています。
#参考 #https://ja.wikipedia.org/wiki/ANI_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88) #https://www.gdgsoft.com/anituner/help/aniformat.htm from os import SEEK_CUR with open(r"C:\Windows\Cursors\aero_busy.ani", "rb") as f: while True: signature = f.read(4).decode("ascii") if len(signature) == 0: break dataSize = int.from_bytes(f.read(4), byteorder="little", signed=False) if signature in ("RIFF", "LIST"): formType = f.read(4).decode("ascii") else: formType = None f.seek(dataSize, SEEK_CUR) print((signature, dataSize, formType))
実行結果
('RIFF', 556296, 'ACON') ('anih', 36, None) ('LIST', 556240, 'fram') ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None) ('icon', 30894, None)