Base64デコードの不具合

  1. 下の文字列は白1pxのPNG画像をBase64エンコードしたものです。
    (Size: 67 バイト, MD5: 6e9ed74162a04a2eb9578dcf295d8557)
    iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQIHWP4DwABAQEANl9ngAAAAABJRU5ErkJggg==

    これをMeryでBase64デコードして拡張子pngで保存すると下のように変わります。
    (Size: 72 バイト, MD5: 9d9bb33ea4d506178e7705ceeb17269b)
    iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQIHWP4DwABAQEANl9ngAAAAABJRU5ErkJgAD0APQAt

    pngcheckでチェックすると
    CRC error in chunk IEND (computed ae426082, expected ae426000)
    となっておりソフトによっては画像ファイルが開けなくなるものもありました。

    他のファイルではサイズが縮むケースもあり
    EOF while reading CRC value
    となっていました。

    また、あまりテスト数は多くありませんが他の形式の画像ファイルやexeファイルなどでもデコードするとファイルサイズが増減することが多いようです。

     |  ucky  |  返信
  2. こんばんは、ご報告ありがとうございます。

    確かにこの文字列をデコードすると元のファイルと異なるものが出来上がってしまいますね。
    Mery の Base64 デコードはもともとあった機能をそのまま拝借しただけだったので、全然理解しておりませんでした、すみません・・・。

    調査してみましたところ、Mery の Base64 デコードはファイルの末尾の = (パディング文字) に対応していないような感じです。規格が何なのかは不明です。

    Base64 の規格は=が必要なものや不要なものさまざまですが、Outlook や Gmail で添付ファイルを付けて送付して確認してみましたところ、やはり = ありで 76 文字改行が入っているので RFC 2045 という規格のような気がします。(情報が少なくて正確には分かりませんが)

    一応、メールの添付ファイルの抽出が目的で搭載している機能なので、このあたりを踏まえて再度作りなおしてみます。

    ・・・もしかして Base64 デコード機能自体、不要だったりしませんか?w

     |  Kuro  |  返信
  3. > ・・・もしかして Base64 デコード機能自体、不要だったりしませんか?w
    正直テキストエディターに必要かは微妙ですよね。
    実際自分もB64という専用ソフトを今まで使わせていただいておりました。
    「monoeditor」というBase64エンコード/デコード機能の付いたテキストエディターが1月22日に窓の杜で紹介されていて、MeryにもBase64デコード機能があった事を思い出し試しに使ってみて今回の現象に遭遇した次第です。

    なのでこの件の修正は優先度低めでいいと個人的には思ってます。

    パラパラと不具合報告して申し訳なく思っております。
    いつも素早い対応ありがとうございます。

    ちなみに「monoeditor」はVisial Studioのソースコードも配布されてるようなのでもしかしたら参考になるかもしれません。

     |  ucky  |  返信
  4. こんばんは、書き込みありがとうございます。

    > 正直テキストエディターに必要かは微妙ですよね。

    ですよねw
    一応、搭載してしまったものは仕方がないということで修正作業をしておりました。

    > パラパラと不具合報告して申し訳なく思っております。
    > いつも素早い対応ありがとうございます。

    いえいえ、まとめてドカンと来てしまうと私がやる気なくなってしまいますからw
    小刻みのほうがありがたいです。

    しかし、バグがなかなか完治できず申し訳ございません。

    > ちなみに「monoeditor」はVisial Studioのソースコードも配布されてるようなのでもしかしたら参考になるかもしれません。

    なるほど、こういうテキストエディタもあるのですね。Base64 デコードの部分のソースコードを見させていただきました。なんと、C# に標準でその機能があるようで、一行で終わってました。

    じゃぁ、Delphi (私の開発環境) にもあるんじゃないかと思って探してみたら、ありました。それで試しにデコードしてみると先日いただいた 1px の png ファイルなどもバイナリレベルで元に戻っているようなので、そっちに差し替えてみたいと思います。

    いろいろと参考になりました。ありがとうございました。

     |  Kuro  |  返信
スポンサーリンク