fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. { private static final String SEVEN_BIT_CHAR_ERROR = "Not a 7 bit character: '%s'";
  10. private static final String DECIMAL_NOT_MAPPED = "Decimal code '%s' is not mapped to ASCII character";
  11.  
  12. private static final Map<Character, Integer> ASCII_TO_SEVEN_BIT_DECIMAL_MAP;
  13. private static final Map<Integer, Character> SEVEN_BIT_DECIMAL_TO_ASCII_MAP;
  14.  
  15. static {
  16. ASCII_TO_SEVEN_BIT_DECIMAL_MAP = new HashMap<Character, Integer>();
  17. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0040, 0); //@
  18. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A3, 1); //£
  19. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0024, 2); //$
  20. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A5, 3); //¥
  21. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E8, 4); //è
  22. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E9, 5); //é
  23. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F9, 6); //ù
  24. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00EC, 7); //ì
  25. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F2, 8); //ò
  26. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C7, 9); //Ç
  27. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x000A, 10); //LF
  28. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00D8, 11); //Ø
  29. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F8, 12); //ø
  30. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x000D, 13); //carriage return
  31. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C5, 14); //Å
  32. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E5, 15); //å
  33. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x005F, 17); //_
  34. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C6, 28); //Æ
  35. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E6, 29); //æ
  36. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00DF, 30); //ß
  37. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C9, 31); //É
  38. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0020, 32); //space
  39. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0021, 33); //!
  40. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0022, 34); //"
  41. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0023, 35); //#
  42. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A4, 36); //¤
  43. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0025, 37); //%
  44. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0026, 38); //&
  45. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0027, 39); //'
  46. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0028, 40); //(
  47. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0029, 41); //)
  48. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002A, 42); //*
  49. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002B, 43); //+
  50. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002C, 44); //,
  51. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002D, 45); //-
  52. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002E, 46); //.
  53. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002F, 47); ///
  54. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0030, 48); //0
  55. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0031, 49); //1
  56. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0032, 50); //2
  57. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0033, 51); //3
  58. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0034, 52); //4
  59. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0035, 53); //5
  60. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0036, 54); //6
  61. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0037, 55); //7
  62. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0038, 56); //8
  63. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0039, 57); //9
  64. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003A, 58); //:
  65. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003B, 59); //;
  66. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003C, 60); //<
  67. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003D, 61); //=
  68. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003E, 62); //>
  69. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003F, 63); //?
  70. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A1, 64); //¡
  71. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0041, 65); //A
  72. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0042, 66); //B
  73. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0043, 67); //C
  74. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0044, 68); //D
  75. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0045, 69); //E
  76. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0046, 70); //F
  77. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0047, 71); //G
  78. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0048, 72); //H
  79. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0049, 73); //I
  80. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004A, 74); //J
  81. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004B, 75); //K
  82. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004C, 76); //L
  83. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004D, 77); //M
  84. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004E, 78); //N
  85. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004F, 79); //O
  86. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0050, 80); //P
  87. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0051, 81); //Q
  88. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0052, 82); //R
  89. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0053, 83); //S
  90. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0054, 84); //T
  91. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0055, 85); //U
  92. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0056, 86); //V
  93. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0057, 87); //W
  94. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0058, 88); //X
  95. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0059, 89); //Y
  96. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x005A, 90); //Z
  97. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C4, 91); //Ä
  98. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00D6, 92); //Ö
  99. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00D1, 93); //Ñ
  100. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00DC, 94); //Ü
  101. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A7, 95); //§
  102. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00BF, 96); //¿
  103. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0061, 97); //a
  104. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0062, 98); //b
  105. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0063, 99); //c
  106. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0064, 100); //d
  107. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0065, 101); //e
  108. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0066, 102); //f
  109. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0067, 103); //g
  110. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0068, 104); //h
  111. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0069, 105); //i
  112. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006A, 106); //j
  113. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006B, 107); //k
  114. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006C, 108); //l
  115. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006D, 109); //m
  116. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006E, 110); //n
  117. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006F, 111); //o
  118. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0070, 112); //p
  119. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0071, 113); //q
  120. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0072, 114); //r
  121. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0073, 115); //s
  122. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0074, 116); //t
  123. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0075, 117); //u
  124. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0076, 118); //v
  125. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0077, 119); //w
  126. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0078, 120); //x
  127. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0079, 121); //y
  128. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x007A, 122); //z
  129. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E4, 123); //ä
  130. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F6, 124); //ö
  131. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F1, 125); //ñ
  132. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00FC, 126); //ü
  133. ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E0, 127); //à
  134.  
  135. SEVEN_BIT_DECIMAL_TO_ASCII_MAP = new HashMap<Integer, Character>();
  136. for (Map.Entry<Character, Integer> entry : ASCII_TO_SEVEN_BIT_DECIMAL_MAP.entrySet()) {
  137. SEVEN_BIT_DECIMAL_TO_ASCII_MAP.put(entry.getValue(), entry.getKey());
  138. }
  139. }
  140.  
  141. public static String encode(String ascii) {
  142. return get7BitHex(pad(get7BitBinaries(ascii), 8));
  143. }
  144.  
  145. public static String decode(String sevenBitHex) {
  146. return getAscii(get8BitBinaries(sevenBitHex));
  147. }
  148.  
  149. private static String getAscii(StringBuilder binaries) {
  150. StringBuilder decoded = new StringBuilder();
  151. for (int i = binaries.length(); i >= 7; i -= 7) {
  152. String septet = binaries.substring(i - 7, i);
  153. int decimal = Integer.parseInt(septet, 2);
  154. Character character = SEVEN_BIT_DECIMAL_TO_ASCII_MAP.get(decimal);
  155.  
  156. decoded.append(character);
  157. }
  158. return decoded.toString();
  159. }
  160.  
  161. private static StringBuilder get8BitBinaries(String sevenBitHex) {
  162. int len = sevenBitHex.length();
  163. StringBuilder binaries = new StringBuilder();
  164. for (int i = len; i >= 2; i -= 2) {
  165. String hex = sevenBitHex.substring(i - 2, i);
  166. String binary = Integer.toBinaryString(Integer.parseInt(hex, 16));
  167. binaries.append(pad(binary, 8));
  168. }
  169. return binaries;
  170. }
  171.  
  172. private static String get7BitBinaries(String s) {
  173. StringBuilder binaries = new StringBuilder(s.length() * 7);
  174. char[] chars = s.toCharArray();
  175. for (int i = chars.length - 1; i >= 0; i--) {
  176. char character = chars[i];
  177. Integer code = ASCII_TO_SEVEN_BIT_DECIMAL_MAP.get(character);
  178.  
  179. String binary = pad(Integer.toBinaryString(code), 7);
  180. binaries.append(binary);
  181. }
  182. return binaries.toString();
  183. }
  184.  
  185. private static String get7BitHex(String binaries) {
  186. int len = binaries.length();
  187. StringBuilder hex = new StringBuilder((len / 8) * 2);
  188. for (int i = len; i >= 8; i -= 8) {
  189. String binary = binaries.substring(i - 8, i);
  190. String h = Integer.toHexString(Integer.parseInt(binary, 2));
  191. hex.append(pad(h, 2));
  192. }
  193. return hex.toString().toUpperCase();
  194. }
  195.  
  196. public static String pad(String binary, int divisible) {
  197. int len = binary.length();
  198. int rem = len % divisible;
  199. if (rem == 0) {
  200. return binary;
  201. }
  202. int padCount = divisible - rem;
  203. StringBuilder padding = new StringBuilder();
  204. for (int i = 0; i < padCount; i++) {
  205. padding.append("0");
  206. }
  207. return padding.toString() + binary;
  208. }
  209.  
  210. public static void main(String[] args){
  211. System.out.println(decode("C8329BFD0651CB733A"));
  212. System.out.println(encode("Hello Test").length());
  213. }
  214. }
Success #stdin #stdout 0.18s 57716KB
stdin
Standard input is empty
stdout
Hello Test
18