• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:java)

JavaでBase64エンコードのデコードプログラムのエラーが出ます。

このQ&Aのポイント
  • JavaでBase64にエンコードしたものをデコードするプログラムでエラーが出ています。コンパイルは通ったのですが、実行したらArrayIndexOutOfBoundsExceptionが発生しています。
  • エラーメッセージによると、問題の行は51行目と23行目ですが、原因がよく分かりません。
  • 質問は初歩的かもしれませんが、どなたか解決方法を教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

table[0] が 'A' ってことは, エンコードでは「64進表現したときに 0 だったらその桁は A で表しましょう」ってことだよね. ということは, デコードはその逆だから「'A' という文字があったらそれは 0 だと思いましょう」としなきゃならない. なので, 例えば int decoded; for (decoded = 0; decoded < table.length; ++decoded) { if (table[decoded] == cs[i]) { break; } } とすれば cs[i] の内容を 64進に逆変換できる, はず. これを cs 中の全ての要素で行い, しかる後に 6ビット×4桁を 8ビット×3文字に変換すれば戻るんじゃないかな. まあ, 最後にある (かもしれない) '=' についてはそれなりに対応してくれってことで.

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

buf[i] = table[cs[i]]; って, 何を期待しているんだろう. cs[i] の値は調べた?

naginagi0000
質問者

補足

我ながらなぞの処理をしていることに今気づきました。これの対になる下記のエンコードプログラムをまねて書いていたのでわけが分からないことになってます。これでエンコードしたものをデコードするプログラムを作成したいのですが・・・ import java.io.*; public class Base64Encode { public static void main(String[] args) { char[] table = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; InputStream in = null; // 入力データ OutputStream out = null; // 出力先 try { in = new FileInputStream(args[0]); out = new FileOutputStream(args[1]); int[] buf; while ((buf=read(in)) != null) { int[] buf2 = convert8to6(buf); for (int i=0; i<buf.length; i++) { System.out.print(buf[i]+", "); } System.out.println(); char[] cs = encode(buf2, table); write(out, cs); } } catch (Exception e) { e.printStackTrace(); // 例外の情報を表示する } finally { // in, out を閉じる try { in.close(); out.close(); } catch (Exception e) { } } } public static char[] encode(int[] buf2, char[] table) { char[] cs = new char[buf2.length]; for (int i=0; i<cs.length; i++) { cs[i] = table[buf2[i]]; } return cs; } public static int[] convert8to6(int[] buf) { String b; int[] buf2; if (buf.length == 1) { b = toBinary(buf[0], 8) + "0000"; buf2 = new int[2]; buf2[0] = fromBinary(b.substring(0, 6)); buf2[1] = fromBinary(b.substring(6, 12)); } else if (buf.length == 2) { b = toBinary(buf[0], 8) + toBinary(buf[1], 8) + "00"; buf2 = new int[3]; buf2[0] = fromBinary(b.substring(0, 6)); buf2[1] = fromBinary(b.substring(6, 12)); buf2[2] = fromBinary(b.substring(12, 18)); } else { b = toBinary(buf[0], 8) + toBinary(buf[1], 8) + toBinary(buf[2], 8); buf2 = new int[4]; buf2[0] = fromBinary(b.substring(0, 6)); buf2[1] = fromBinary(b.substring(6, 12)); buf2[2] = fromBinary(b.substring(12, 18)); buf2[3] = fromBinary(b.substring(18, 24)); } return buf2; } public static void write(OutputStream out, char[] cs) throws IOException { for (int i=0; i<4; i++) { if (i<cs.length) { out.write(cs[i]); } else { out.write('='); } } } public static int[] read(InputStream in) throws IOException { int[] bs; int n0=in.read(); int n1=in.read(); int n2=in.read(); if (n0 < 0) { // 読み込み終了 bs = null; } else if (n1 < 0) { bs = new int[1]; bs[0] = n0; } else if (n2 < 0) { bs = new int[2]; bs[0] = n0; bs[1] = n1; } else { bs = new int[3]; bs[0] = n0; bs[1] = n1; bs[2] = n2; } return bs; } public static String toBinary(int bt, int n) { String s = Integer.toBinaryString(bt); for (int i=s.length(); i<n; i++) { s = "0" + s; } return s; } public static int fromBinary(String b) { return Integer.parseInt(b, 2); } }

関連するQ&A