PNG ファイルを読み取り、そこに格納されているすべての情報を解釈して、人間が読める形式で印刷する必要があります。PNG の作業中に、各チャンクのチェックサムの生成に CRC-32 が使用されていることがわかりました。しかし、PNG ファイル仕様サイトに記載されている次の情報を理解できませんでした。 + 1
参照用のリンクは次のとおりです: http://www.w3.org/TR/PNG/
誰でもこれを理解するのを手伝ってもらえますか?
PNG ファイルを読み取り、そこに格納されているすべての情報を解釈して、人間が読める形式で印刷する必要があります。PNG の作業中に、各チャンクのチェックサムの生成に CRC-32 が使用されていることがわかりました。しかし、PNG ファイル仕様サイトに記載されている次の情報を理解できませんでした。 + 1
参照用のリンクは次のとおりです: http://www.w3.org/TR/PNG/
誰でもこれを理解するのを手伝ってもらえますか?
http://en.wikipedia.org/wiki/Computation_of_CRC ?
wiki の CRC のリストによると、この多項式 (別名 AUTODIN II polynomial ) は、最も使用されているものの 1 つです。CRC-32-IEEE 802.3 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
(イーサネット、V.42、MPEG-2、PNG、POSIX cksum、Arj、Lha32、Rar、Zip などで使用)
によってマークされた力で書き直されました^
:
x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1.
したがって、cksum のソースを読むことができます。
http://www.opensource.apple.com/source/file_cmds/file_cmds-188/cksum/crc32.c
32 ビットの AutoDIN-II CRC は、次のシフト レジスタ参照モデルに基づいて構築されています。
多項式: g(x) = 1 + x + x^4 + x^5 + x^7 + x^8 + x^10 + x^11 + x^12 + x^1 + x^22 + x^23 + x^26 + x^32
入力データ ビット 0 ファースト
Leading-zero checking is performed by the following procedure: 1. The crc register is initialized to 0xffffffff, not zero. 2. When a crc is appended, the 32 bits of the crc are inverted. 3. When checking a good message with an appended crc, the register will return to the fixed value of 0xdebb20e3, rather than zero.
それが zlib に実装されている CRC-32 アルゴリズムです。代わりにそのライブラリを使用できる場合は、独自のものを実装しないでください。
[編集]: zlib から CRC 計算機を使用する方法 (zlib ドキュメントから抽出された C の例)。
#include <zlib.h>
uLong crc = crc32(0L, Z_NULL, 0);
while (read_buffer(buffer, length) != EOF) {
crc = crc32(crc, buffer, length);
}
if (crc != original_crc) error();
CRC を取得したいデータのブロックがある場合、その while ループは必要ありません。初期値を取得し (crc
上記への最初の割り当て)、次に、持っているデータに対して値を計算します (への 2 番目の割り当てcrc
)。