質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1186閲覧

PNGのadler32の計算が合わない

RideWitMe_jp

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/04/15 07:10

前提・実現したいこと

PNGの画像を読み込みんだアドラー32の値と計算した値が違うので解決したい。

プログラミング初心者です。PNGのデコード、エンコードのコードを自力で書いています。
アドラー32の計算をWikipediaなどのネット上に載っているコードを使ってみたが計算が合いません。

macプレビューではエンコードした画像を読み込んで表示できるので
表示を見ると読み込んだRGBAの値が違うという原因ではないように思います。
下のような画像です。

読み込んだ画像

発生している問題・エラーメッセージ

<参考> 読み込んだadler32->2085692484 計算したadler32->3944975942

該当のソースコード

c

1unsigned long update_adler32(unsigned long adler, 2 unsigned char *buf, unsigned len) 3{ 4 unsigned long s1 = adler & 0xffff; 5 unsigned long s2 = (adler >> 16) & 0xffff; 6 int n; 7 8 for (n = 0; n < len; n++) { 9 s1 = (s1 + buf[n]) % BASE; 10 s2 = (s2 + s1) % BASE; 11 } 12 return (s2 << 16) + s1; 13} 14 15unsigned char RGB[10000];//読み込んだrgbの値 16unsigned long adler=1L; 17 18adler=update_adler32(adler,RGB,10000);

試したこと

pngをデコードしRGBA値に対して計算し、読み込んだadler32の値と比べた
pngをエンコードし、計算した値を書き込んだが、チェックするソフトでははじかれる。
共にadler32の計算値が違うようです。
チェックしない?mac OS プレビューでは表示できます。

補足情報(FW/ツールのバージョンなど)

使用ソフトはxcode 10.1です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/04/15 07:26

BASE は 65521 でしょうか?
RideWitMe_jp

2019/04/15 07:27

すみません、65521です。
jimbe

2019/04/15 07:45

見た目としては RFC1950 ( https://tools.ietf.org/html/rfc1950 ) の9ページ目のままのようですので, RGB の値のほうが問題かと思います. そちらをご確認しては如何でしょうか.
RideWitMe_jp

2019/04/15 08:11

RGBの方が問題ですか。わかりました、別の画像などいろいろ確かめてみます。 ご回答ありがとうございます。
guest

回答1

0

ベストアンサー

実際にpngからチャンクを切り出してinflateすると分かりますが
格納されているデータは50[行] * (4*50[列]+1) = 10050[byte]のデータです。

この1が何かと言うとこちらの解説によると行ごとのフィルターメソッド番号らしいです。

なお、切り出してinflateしたデータをadler32でハッシュ化すると7C512444が得られました。

(というか、zlibが勝手にadler32は付加するはずですが・・・)


各フィルターの解説

投稿2019/04/16 05:23

編集2019/04/16 05:38
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RideWitMe_jp

2019/04/16 09:58

フィルター1バイトの付加、zlib公式コードでの圧縮で正しい答えがでることは承知しておりました。 単純な計算なので疑う余地がなさそうですが、アドラーの式に問題があるかと思いましたが、、、 その他に問題があるか再検証してみます。 実際に確認いただき、ありがとうございました。
asm

2019/04/16 11:22

フィルター番号を付加する必要があることを認識していたとのことですが > adler=update_adler32(adler,RGB,10000); 1バイト付加されてませんよね? また、添付画像からinflateしたデータのadler32を質問のソースから計算できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問