2017年9月14日木曜日

PNGファイルシグネチャ

 ソース:PNG 仕様書:原理 12.12.PNGファイルシグネチャ
 ソースの文章を理解できるなら、以下の文章は読まなくていい。

 
 PNGファイルには最初の1バイトが0x89で、次の7バイトが"PNG\r\n\x1A\n"となっている。これの理由について。

 まず最初の0x89だが、これは2進数だと10001001になる。当時、上位1bitを捨てて、7bitで転送するシステムが有ったため、これを通したPNGデータは最初の1バイトが0x09となり、データが破損していることが確認できる。
 また、ASCIIコードは0x00から0x7Fの範囲を使用するので、ソフトウェアによっては明らかにASCIIコードでないファイルとして、テキストデータと誤認されることを防ぐことができる。とはいえ、他の文字コードでは1文字目が何らかの文字として誤認されることもある。例えば、Shift JISでは"\x89P"の一連の文字(0x8950)は’臼’(ウス)の文字が割り当てられている。そのため、日本向けWindowsのメモ帳でPNGファイルを開くと、先頭は"臼NG"で始まる。

 次の"PNG"の3文字は、誤ってPNGファイルをテキストエディタで開いてしまった際に、"PNG"の文字列を表示することにより、PNGデータだと人間に通知することができる。ただし、上記の通り、システムのエンコードによっては正しくPNGと表示されない場合もある。

 次の"\r\n"は、ファイルシステムによって"\r\n"を"\n"に変換されたことを検出することができる。またその後の"\n"も、ファイルシステムによって"\n"が"\r\n"に変換されたことを検出することができる。
 これは、OSによって異なる改行コードの違いをファイルシステムで吸収する際に発生する問題を検出することができる。例えば、C言語のfopenでテキストファイルとして開くと、\r\nと\nの変換が行われる(バイナリファイルとして開けば変換は行われない)。

 その間にある、'\x1A'は、一部のファイルシステムではEnd of Fileを意味し、この文字を検出したシステム(テキストエディタ)はそれ以降のファイルの読み込みを終了する場合がある。

 PNGのファイルシグネチャはこの8バイトだが、場合によっては続けて4バイト程度を読み出す場合もある。
 この4バイトはIHDRチャンクのサイズで、32bitのネットワークバイトオーダーで13が記録されている。これは0x00 0x00 0x00 0x0Dの4バイトだが、システムによってはヌル文字(0x00)を省略する場合があり、その場合は00 00 00 0Dを正しく読めないため、データが破損していることが確認できる。


 以上、PNGのファイルシグネチャの話でした。
 古いフォーマットを見てると当時のシステムの特徴とか出てきて面白いよね。

0 件のコメント:

コメントを投稿