BASE64Decoder.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package org.example;
  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import java.io.PushbackInputStream;
  5. public class BASE64Decoder extends CharacterDecoder {
  6. private static final char[] pem_array = new char[]{'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', '+', '/'};
  7. private static final byte[] pem_convert_array = new byte[256];
  8. byte[] decode_buffer = new byte[4];
  9. static {
  10. int i;
  11. for(i = 0; i < 255; ++i) {
  12. pem_convert_array[i] = -1;
  13. }
  14. for(i = 0; i < pem_array.length; ++i) {
  15. pem_convert_array[pem_array[i]] = (byte)i;
  16. }
  17. }
  18. public BASE64Decoder() {
  19. }
  20. protected int bytesPerAtom() {
  21. return 4;
  22. }
  23. protected int bytesPerLine() {
  24. return 72;
  25. }
  26. protected void decodeAtom(PushbackInputStream inStream, OutputStream outStream, int rem) throws IOException {
  27. byte a = -1;
  28. byte b = -1;
  29. byte c = -1;
  30. byte d = -1;
  31. if (rem < 2) {
  32. throw new RuntimeException("BASE64Decoder: Not enough bytes for an atom.");
  33. } else {
  34. int i;
  35. do {
  36. i = inStream.read();
  37. if (i == -1) {
  38. throw new RuntimeException();
  39. }
  40. } while(i == 10 || i == 13);
  41. this.decode_buffer[0] = (byte)i;
  42. i = this.readFully(inStream, this.decode_buffer, 1, rem - 1);
  43. if (i == -1) {
  44. throw new RuntimeException();
  45. } else {
  46. if (rem > 3 && this.decode_buffer[3] == 61) {
  47. rem = 3;
  48. }
  49. if (rem > 2 && this.decode_buffer[2] == 61) {
  50. rem = 2;
  51. }
  52. switch (rem) {
  53. case 4:
  54. d = pem_convert_array[this.decode_buffer[3] & 255];
  55. case 3:
  56. c = pem_convert_array[this.decode_buffer[2] & 255];
  57. case 2:
  58. b = pem_convert_array[this.decode_buffer[1] & 255];
  59. a = pem_convert_array[this.decode_buffer[0] & 255];
  60. default:
  61. switch (rem) {
  62. case 2:
  63. outStream.write((byte)(a << 2 & 252 | b >>> 4 & 3));
  64. break;
  65. case 3:
  66. outStream.write((byte)(a << 2 & 252 | b >>> 4 & 3));
  67. outStream.write((byte)(b << 4 & 240 | c >>> 2 & 15));
  68. break;
  69. case 4:
  70. outStream.write((byte)(a << 2 & 252 | b >>> 4 & 3));
  71. outStream.write((byte)(b << 4 & 240 | c >>> 2 & 15));
  72. outStream.write((byte)(c << 6 & 192 | d & 63));
  73. }
  74. }
  75. }
  76. }
  77. }
  78. }