質問

PNGファイルを読み取り、その中に保存されているすべての情報を解釈し、人間の読み取り可能な形式で印刷する必要があります。 PNGに取り組んでいる間、私はそれが各チャンクのチェックサムを生成するためにCRC-32を使用していることを理解しました。しかし、PNGファイル仕様サイトで言及されている以下の情報を理解できませんでした:PNGで使用される多項式は、x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + xです+ 1

参照のリンクは次のとおりです。http://www.w3.org/tr/png/

誰かがこれを理解するのを手伝ってくれませんか?

役に立ちましたか?

解決

これが、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を取得したいデータのブロックがある場合、ループ中は必要ありません。初期値を取得するだけです(最初の割り当て crc 上記)そして、あなたが持っているデータの値を計算します(2番目の割り当て crc).

他のヒント

http://en.wikipedia.org/wiki/computation_of_crc ?

WikiのCRCのリストによると、この多項式(別名Autodin II多項式)は最も使用されているものの1つです。 CRC-32-IEEE 802.3 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 + 1

(Ethernet、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.

CRCに関するウィキペディアの記事を読んだことがありますか?統一されたCRC形式はありません。すべての「形式」は、このような多項式上に構築されます。

私もCRCを手作業で計算することにあまり精通していませんが、あなたが見ているのは、実際にはPOSIXで使用されている形式です。私はそれの有用な実装がたくさんあると確信しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top