/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{ private static final String SEVEN_BIT_CHAR_ERROR
= "Not a 7 bit character: '%s'"; private static final String DECIMAL_NOT_MAPPED
= "Decimal code '%s' is not mapped to ASCII character";
private static final Map
<Character, Integer
> ASCII_TO_SEVEN_BIT_DECIMAL_MAP
; private static final Map
<Integer, Character
> SEVEN_BIT_DECIMAL_TO_ASCII_MAP
;
static {
ASCII_TO_SEVEN_BIT_DECIMAL_MAP
= new HashMap
<Character, Integer
>(); ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0040, 0); //@
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A3, 1); //£
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0024, 2); //$
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A5, 3); //¥
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E8, 4); //è
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E9, 5); //é
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F9, 6); //ù
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00EC, 7); //ì
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F2, 8); //ò
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C7, 9); //Ç
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x000A, 10); //LF
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00D8, 11); //Ø
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F8, 12); //ø
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x000D, 13); //carriage return
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C5, 14); //Å
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E5, 15); //å
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x005F, 17); //_
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C6, 28); //Æ
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E6, 29); //æ
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00DF, 30); //ß
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C9, 31); //É
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0020, 32); //space
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0021, 33); //!
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0022, 34); //"
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0023, 35); //#
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A4, 36); //¤
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0025, 37); //%
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0026, 38); //&
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0027, 39); //'
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0028, 40); //(
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0029, 41); //)
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002A, 42); //*
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002B, 43); //+
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002C, 44); //,
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002D, 45); //-
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002E, 46); //.
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x002F, 47); ///
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0030, 48); //0
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0031, 49); //1
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0032, 50); //2
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0033, 51); //3
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0034, 52); //4
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0035, 53); //5
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0036, 54); //6
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0037, 55); //7
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0038, 56); //8
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0039, 57); //9
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003A, 58); //:
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003B, 59); //;
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003C, 60); //<
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003D, 61); //=
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003E, 62); //>
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x003F, 63); //?
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A1, 64); //¡
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0041, 65); //A
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0042, 66); //B
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0043, 67); //C
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0044, 68); //D
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0045, 69); //E
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0046, 70); //F
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0047, 71); //G
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0048, 72); //H
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0049, 73); //I
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004A, 74); //J
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004B, 75); //K
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004C, 76); //L
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004D, 77); //M
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004E, 78); //N
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x004F, 79); //O
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0050, 80); //P
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0051, 81); //Q
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0052, 82); //R
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0053, 83); //S
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0054, 84); //T
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0055, 85); //U
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0056, 86); //V
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0057, 87); //W
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0058, 88); //X
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0059, 89); //Y
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x005A, 90); //Z
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00C4, 91); //Ä
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00D6, 92); //Ö
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00D1, 93); //Ñ
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00DC, 94); //Ü
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00A7, 95); //§
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00BF, 96); //¿
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0061, 97); //a
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0062, 98); //b
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0063, 99); //c
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0064, 100); //d
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0065, 101); //e
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0066, 102); //f
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0067, 103); //g
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0068, 104); //h
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0069, 105); //i
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006A, 106); //j
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006B, 107); //k
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006C, 108); //l
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006D, 109); //m
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006E, 110); //n
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x006F, 111); //o
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0070, 112); //p
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0071, 113); //q
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0072, 114); //r
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0073, 115); //s
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0074, 116); //t
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0075, 117); //u
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0076, 118); //v
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0077, 119); //w
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0078, 120); //x
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x0079, 121); //y
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x007A, 122); //z
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E4, 123); //ä
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F6, 124); //ö
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00F1, 125); //ñ
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00FC, 126); //ü
ASCII_TO_SEVEN_BIT_DECIMAL_MAP.put((char) 0x00E0, 127); //à
SEVEN_BIT_DECIMAL_TO_ASCII_MAP
= new HashMap
<Integer, Character
>(); for (Map.
Entry<Character, Integer
> entry
: ASCII_TO_SEVEN_BIT_DECIMAL_MAP.
entrySet()) { SEVEN_BIT_DECIMAL_TO_ASCII_MAP.put(entry.getValue(), entry.getKey());
}
}
return get7BitHex(pad(get7BitBinaries(ascii), 8));
}
return getAscii(get8BitBinaries(sevenBitHex));
}
private static String getAscii
(StringBuilder binaries
) { StringBuilder decoded = new StringBuilder();
for (int i = binaries.length(); i >= 7; i -= 7) {
String septet
= binaries.
substring(i
- 7, i
); int decimal
= Integer.
parseInt(septet,
2); Character character
= SEVEN_BIT_DECIMAL_TO_ASCII_MAP.
get(decimal
);
decoded.append(character);
}
return decoded.toString();
}
private static StringBuilder get8BitBinaries
(String sevenBitHex
) { int len = sevenBitHex.length();
StringBuilder binaries = new StringBuilder();
for (int i = len; i >= 2; i -= 2) {
String hex
= sevenBitHex.
substring(i
- 2, i
); binaries.append(pad(binary, 8));
}
return binaries;
}
StringBuilder binaries = new StringBuilder(s.length() * 7);
char[] chars = s.toCharArray();
for (int i = chars.length - 1; i >= 0; i--) {
char character = chars[i];
Integer code
= ASCII_TO_SEVEN_BIT_DECIMAL_MAP.
get(character
);
binaries.append(binary);
}
return binaries.toString();
}
int len = binaries.length();
StringBuilder hex = new StringBuilder((len / 8) * 2);
for (int i = len; i >= 8; i -= 8) {
String binary
= binaries.
substring(i
- 8, i
); hex.append(pad(h, 2));
}
return hex.toString().toUpperCase();
}
int len = binary.length();
int rem = len % divisible;
if (rem == 0) {
return binary;
}
int padCount = divisible - rem;
StringBuilder padding = new StringBuilder();
for (int i = 0; i < padCount; i++) {
padding.append("0");
}
return padding.toString() + binary;
}
public static void main
(String[] args
){ System.
out.
println(decode
("C8329BFD0651CB733A")); System.
out.
println(encode
("Hello Test").
length()); }
}