高見知英の技術ログ

技術関係のログをQiitaから移行してきました。プログラミングのほか、使っているアプリの細かい仕様についてなど書いていきます。

CertUtilは巨大なファイルを処理することができない

とある事情によりファイルをBASE64エンコードする必要が生じました。いちいちソフトを入れるのは面倒くさいのでバッチファイルだけで処理できないかと探してみたところ、CertUtilというWindows標準のツールがBASE64変換の機能を持っているとのこと。

qiita.com

しかし実際使ってみると、ファイルによっては期待通り動かず、0バイトのテキストファイルを出力するだけして止まってしまうことがある模様。

とりあえず5GBの動画ファイルを読み込ませようとすると、以下のログが表示されます。

> certutil -f -encode .\,movie.mp4 .\movie.base64.txt
入力長 = 1816822796
出力長 = 0
CertUtil: -encode コマンドは正常に完了しました。

出力長が0ってどう見ても正常に完了してないんですが・・・。とりあえず原因はもう少し小さいファイルを送りつけると表示されます。

> certutil.exe -f -encode .\movie.zip.001.img .\movie.base64.txt
入力長 = 838860800
EncodeToFile は 算術結果が 32 ビットを超えています。 0x80070216 (WIN32: 534 ERROR_ARITHMETIC_OVERFLOW) を返しました
CertUtil: -encode コマンド エラーです: 0x80070216 (WIN32: 534 ERROR_ARITHMETIC_OVERFLOW)
CertUtil: 算術結果が 32 ビットを超えています。

と、いうことで、具体的な限界値は分かりませんが、CertUtil -f -encodeは巨大なファイルを読み込もうとするとエラーを吐くようです。

よって、巨大なファイルをエンコードしたい場合は面倒でも別言語でプログラムするなり外部ツールを使う必要があります。結局いろいろ苦心した結果この対応は必要なくなったためこれ以上のことはしていませんが。

ということで、バッチファイルでファイルをBASE64エンコードしようとしたのに上手くいかない というときは、ファイルサイズに気をつけてみてください というお話しでした。