potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

Python 3 WindowsアニメーションカーソルのRIFFヘッダー構造を解析する

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)