fork download
  1. import java.io.*;
  2.  
  3. public class Base64Decode {
  4. public static void main(String[] args) {
  5. // 変換テーブル
  6. char[] table = {
  7. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  8. 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  9. 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  10. 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  11. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  12. 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  13. 'w', 'x', 'y', 'z', '0', '1', '2', '3',
  14. '4', '5', '6', '7', '8', '9', '+', '/'};
  15.  
  16. InputStream in = null; // 入力データ
  17. OutputStream out = null; // 出力先
  18.  
  19. try {
  20. in = new FileInputStream(args[0]);
  21. out = new FileOutputStream(args[1]);
  22. char[] cs;
  23. while((cs=read4(in))!=null) {
  24. write3(out, convert6to8(decode(cs, table)));
  25. }
  26. } catch (Exception e) {
  27. e.printStackTrace(); // 例外の情報を表示する
  28. } finally { // in, out を閉じる
  29. try {
  30. in.close();
  31. out.close();
  32. }
  33. catch (Exception e) {
  34. }
  35. }
  36. }
  37.  
  38. public static int[] decode(char[] cs, char[] table) {
  39. int[] ret = new int[cs.length];
  40. for(int i=0; i<cs.length; i++) {
  41. for(int j=0; j<table.length; j++) {
  42. if(cs[i] == table[j]) {
  43. ret[i] = j;
  44. break;
  45. }
  46. }
  47. }
  48. return ret;
  49. }
  50.  
  51. public static int[] convert6to8(int[] buf) {
  52. StringBuilder fb = new StringBuilder();
  53. for(int i=0; i<buf.length; i++) {
  54. fb.append(toBinary(buf[i], 6));
  55. }
  56. int[] ret = new int[fb.length()/6-1];
  57. for(int i=0; i<ret.length; i++) {
  58. String f = fb.substring(i*8, i*8+8);
  59. ret[i] = fromBinary(f);
  60. }
  61. return ret;
  62. }
  63.  
  64. /**
  65.   * バイト列 bt の数を順に出力する.
  66.   * @param bt 数の配列。長さは 3以下. 各数は8ビットの整数
  67.   */
  68. public static void write3(OutputStream out, int[] bt) throws IOException {
  69. for (int i=0; i<3; i++) {
  70. if (i<bt.length) {
  71. out.write(bt[i]);
  72. }
  73. }
  74. }
  75.  
  76. /**
  77.   * in から文字を最大4つ読み出す.
  78.   * @param in 入力ストリーム
  79.   * @return 文字の配列。配列長は最大4. 入力終了したときには null を返す.
  80.   */
  81. public static char[] read4(InputStream in) throws IOException {
  82. char[] bs;
  83. int n0=in.read();
  84. int n1=in.read();
  85. int n2=in.read();
  86. int n3=in.read();
  87.  
  88. if (n0 < 0) { // 読み込み終了
  89. bs = null;
  90. } else if (n2 < 0 || (char) n2=='=') {
  91. bs = new char[2];
  92. bs[0] = (char) n0;
  93. bs[1] = (char) n1;
  94. } else if (n3 < 0 || (char) n3=='=') {
  95. bs = new char[3];
  96. bs[0] = (char) n0;
  97. bs[1] = (char) n1;
  98. bs[2] = (char) n2;
  99. } else {
  100. bs = new char[4];
  101. bs[0] = (char) n0;
  102. bs[1] = (char) n1;
  103. bs[2] = (char) n2;
  104. bs[3] = (char) n3;
  105. }
  106. return bs;
  107. }
  108.  
  109. /**
  110.   * 数を読み取って、nビットの2進数を表す文字列に変換する
  111.   * @param bt 1バイトの数
  112.   * @param n 2進数のビット数
  113.   * @return 2進数を表す文字列
  114.   */
  115. public static String toBinary(int bt, int n) {
  116. String s = Integer.toBinaryString(bt);
  117. for (int i=s.length(); i<n; i++) {
  118. s = "0" + s;
  119. }
  120. return s;
  121. }
  122.  
  123. /**
  124.   * 2進数を表す文字列を数に変換する
  125.   * @param b 2進数を表す文字列
  126.   * @return b が表す数
  127.   */
  128. public static int fromBinary(String b) {
  129. return Integer.parseInt(b, 2);
  130. }
  131. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty