きれいでありませんが、それなりに動作するものを書いてみました。
java
1 public class BaseNum {
2 public static void main ( String [ ] args ) {
3 char [ ] chars = {
4 '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' ,
5 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' ,
6 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' ,
7 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z' ,
8 ' '
9 } ;
10 for ( char c : chars ) {
11 try {
12 int num = charToNum ( c , 36 ) ;
13 String str36 = numToStr ( num , 36 ) ;
14 System . out . println ( "" + c + " -> " + charToNum ( c , 36 ) + " -> " + str36 ) ;
15 } catch ( Exception e ) {
16 System . out . println ( e ) ;
17 }
18 }
19
20 String [ ] strs = {
21 "0" , "0000" ,
22 "0001" , "1234" , "5678" , "9999" ,
23 "ABCD" , "EFGH" , "IJKL" , "MNOP" , "QRST" , "UVWX" , "YZ01" , "ZZZZ" ,
24 "ABCDEFGHIJKLMNOPQRSTUBWXYZ1234567890"
25 } ;
26 for ( String str : strs ) {
27 try {
28 int num = strToNum ( str , 36 ) ;
29 String str36 = numToStr ( num , 36 ) ;
30 System . out . println ( str + " -> " + num + " -> " + str36 ) ;
31 } catch ( Exception e ) {
32 System . out . println ( e ) ;
33 }
34 }
35 }
36
37 // 36進数を定義
38 private static final String NUMS = "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
39
40 // Base進数の1文字を10進数に変換する
41 public static final int charToNum ( final char c , final int base ) throws Exception {
42 int n = NUMS . indexOf ( c ) ;
43 if ( ( 0 <= n ) && ( n < base ) ) {
44 return n ;
45 }
46 throw new Exception ( "Bad char:[" + c + "]" ) ;
47 }
48
49 // Base進数の文字を10進数に変換する
50 public static final int strToNum ( final String str , final int base ) throws Exception {
51 int n = 0 ;
52 // TODO: str の先頭が +や-始まる場合も扱えるようにする事
53 for ( final char c : str . toCharArray ( ) ) {
54 n = n * base + charToNum ( c , base ) ;
55 if ( n < 0 ) {
56 throw new Exception ( "Overflow: [" + str + "]" ) ;
57 }
58 }
59 return n ;
60 }
61
62 // 数字を Base進の文字列に変換する
63 public static final String numToStr ( final int num , final int base ) {
64 if ( num == 0 ) {
65 return "0" ;
66 }
67
68 String str = "" ;
69 String sign = "" ;
70 int work = num ;
71 if ( work < 0 ) {
72 sign = "-" ;
73 work *= - 1 ;
74 }
75 while ( work > 0 ) {
76 int k = work % base ;
77 str = NUMS . substring ( k , k + 1 ) + str ;
78 work = work / base ;
79 }
80 return sign + str ;
81 }
82 }
実行例
0 -> 0 -> 0
1 -> 1 -> 1
2 -> 2 -> 2
3 -> 3 -> 3
4 -> 4 -> 4
5 -> 5 -> 5
6 -> 6 -> 6
7 -> 7 -> 7
8 -> 8 -> 8
9 -> 9 -> 9
A -> 10 -> A
B -> 11 -> B
C -> 12 -> C
D -> 13 -> D
E -> 14 -> E
F -> 15 -> F
G -> 16 -> G
H -> 17 -> H
I -> 18 -> I
J -> 19 -> J
K -> 20 -> K
L -> 21 -> L
M -> 22 -> M
N -> 23 -> N
O -> 24 -> O
P -> 25 -> P
Q -> 26 -> Q
R -> 27 -> R
S -> 28 -> S
T -> 29 -> T
U -> 30 -> U
V -> 31 -> V
W -> 32 -> W
X -> 33 -> X
Y -> 34 -> Y
Z -> 35 -> Z
java.lang.Exception: Bad char:[ ]
0 -> 0 -> 0
0000 -> 0 -> 0
0001 -> 1 -> 1
1234 -> 49360 -> 1234
5678 -> 241316 -> 5678
9999 -> 431901 -> 9999
ABCD -> 481261 -> ABCD
EFGH -> 673217 -> EFGH
IJKL -> 865173 -> IJKL
MNOP -> 1057129 -> MNOP
QRST -> 1249085 -> QRST
UVWX -> 1441041 -> UVWX
YZ01 -> 1631665 -> YZ01
ZZZZ -> 1679615 -> ZZZZ
java.lang.Exception: Overflow: [ABCDEFGHIJKLMNOPQRSTUBWXYZ1234567890]
↑では 0 から Z を整数に変換できること、それを36進にすると元の文字に戻ること
幾つかの4文字の文字列が数字に変換できること、それを36進にすると元に戻ること
が確認できています。
不正な文字があるとエラーになること、あまり長い文字列を指定するとエラーになることも確認しています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/17 13:32