1
+ /*
2
+ *
3
+ * @author
4
+ *
5
+ */
6
+ class ArrayTools {
7
+ public constructor ( ) {
8
+ }
9
+
10
+
11
+ //随机打乱数组
12
+ public static RandomSort ( list :any ) :void {
13
+ list . sort ( function ( ) {
14
+ return Math . random ( ) - 0.5 ;
15
+ } ) ;
16
+ }
17
+
18
+ //数组排序
19
+ public static Sort ( list :any ) :void {
20
+ list . sort ( function ( a , b ) {
21
+ return a - b
22
+ } ) ;
23
+ }
24
+
25
+ /**
26
+ * UTF16和UTF8转换对照表
27
+ * U+00000000 – U+0000007F 0xxxxxxx
28
+ * U+00000080 – U+000007FF 110xxxxx 10xxxxxx
29
+ * U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
30
+ * U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
31
+ * U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
32
+ * U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
33
+ */
34
+ // 转码表
35
+ private static table = [
36
+ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' ,
37
+ 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' ,
38
+ 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' ,
39
+ 'Y' , 'Z' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' ,
40
+ 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
41
+ 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' ,
42
+ 'w' , 'x' , 'y' , 'z' , '0' , '1' , '2' , '3' ,
43
+ '4' , '5' , '6' , '7' , '8' , '9' , '+' , '/'
44
+ ] ;
45
+
46
+ public static UTF16ToUTF8 ( str ) {
47
+ var res = [ ] , len = str . length ;
48
+ for ( var i = 0 ; i < len ; i ++ ) {
49
+ var code = str . charCodeAt ( i ) ;
50
+ if ( code > 0x0000 && code <= 0x007F ) {
51
+ // 单字节,这里并不考虑0x0000,因为它是空字节
52
+ // U+00000000 – U+0000007F 0xxxxxxx
53
+ res . push ( str . charAt ( i ) ) ;
54
+ } else if ( code >= 0x0080 && code <= 0x07FF ) {
55
+ // 双字节
56
+ // U+00000080 – U+000007FF 110xxxxx 10xxxxxx
57
+ // 110xxxxx
58
+ var byte1 = 0xC0 | ( ( code >> 6 ) & 0x1F ) ;
59
+ // 10xxxxxx
60
+ var byte2 = 0x80 | ( code & 0x3F ) ;
61
+ res . push (
62
+ String . fromCharCode ( byte1 ) ,
63
+ String . fromCharCode ( byte2 )
64
+ ) ;
65
+ } else if ( code >= 0x0800 && code <= 0xFFFF ) {
66
+ // 三字节
67
+ // U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
68
+ // 1110xxxx
69
+ var byte1 = 0xE0 | ( ( code >> 12 ) & 0x0F ) ;
70
+ // 10xxxxxx
71
+ var byte2 = 0x80 | ( ( code >> 6 ) & 0x3F ) ;
72
+ // 10xxxxxx
73
+ var byte3 = 0x80 | ( code & 0x3F ) ;
74
+ res . push (
75
+ String . fromCharCode ( byte1 ) ,
76
+ String . fromCharCode ( byte2 ) ,
77
+ String . fromCharCode ( byte3 )
78
+ ) ;
79
+ } else if ( code >= 0x00010000 && code <= 0x001FFFFF ) {
80
+ // 四字节
81
+ // U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
82
+ } else if ( code >= 0x00200000 && code <= 0x03FFFFFF ) {
83
+ // 五字节
84
+ // U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
85
+ } else /** if (code >= 0x04000000 && code <= 0x7FFFFFFF)*/ {
86
+ // 六字节
87
+ // U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
88
+ }
89
+ }
90
+ return res . join ( '' ) ;
91
+ }
92
+
93
+ public static UTF8ToUTF16 ( str ) {
94
+ var res = [ ] , len = str . length ;
95
+ var i = 0 ;
96
+ for ( var i = 0 ; i < len ; i ++ ) {
97
+ var code = str . charCodeAt ( i ) ;
98
+ // 对第一个字节进行判断
99
+ if ( ( ( code >> 7 ) & 0xFF ) == 0x0 ) {
100
+ // 单字节
101
+ // 0xxxxxxx
102
+ res . push ( str . charAt ( i ) ) ;
103
+ } else if ( ( ( code >> 5 ) & 0xFF ) == 0x6 ) {
104
+ // 双字节
105
+ // 110xxxxx 10xxxxxx
106
+ var code2 = str . charCodeAt ( ++ i ) ;
107
+ var byte1 = ( code & 0x1F ) << 6 ;
108
+ var byte2 = code2 & 0x3F ;
109
+ var utf16 = byte1 | byte2 ;
110
+ res . push ( String . fromCharCode ( utf16 ) ) ;
111
+ } else if ( ( ( code >> 4 ) & 0xFF ) == 0xE ) {
112
+ // 三字节
113
+ // 1110xxxx 10xxxxxx 10xxxxxx
114
+ var code2 = str . charCodeAt ( ++ i ) ;
115
+ var code3 = str . charCodeAt ( ++ i ) ;
116
+ var byte1 = ( code << 4 ) | ( ( code2 >> 2 ) & 0x0F ) ;
117
+ var byte2 = ( ( code2 & 0x03 ) << 6 ) | ( code3 & 0x3F ) ;
118
+ var utf16 = ( ( byte1 & 0x00FF ) << 8 ) | byte2
119
+ res . push ( String . fromCharCode ( utf16 ) ) ;
120
+ } else if ( ( ( code >> 3 ) & 0xFF ) == 0x1E ) {
121
+ // 四字节
122
+ // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
123
+ } else if ( ( ( code >> 2 ) & 0xFF ) == 0x3E ) {
124
+ // 五字节
125
+ // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
126
+ } else /** if (((code >> 1) & 0xFF) == 0x7E)*/ {
127
+ // 六字节
128
+ // 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
129
+ }
130
+ }
131
+
132
+ return res . join ( '' ) ;
133
+ }
134
+
135
+ public static Base64Encode ( str ) {
136
+ if ( ! str ) {
137
+ return '' ;
138
+ }
139
+ var utf8 = this . UTF16ToUTF8 ( str ) ; // 转成UTF8
140
+ var i = 0 ; // 遍历索引
141
+ var len = utf8 . length ;
142
+ var res = [ ] ;
143
+ while ( i < len ) {
144
+ var c1 = utf8 . charCodeAt ( i ++ ) & 0xFF ;
145
+ res . push ( this . table [ c1 >> 2 ] ) ;
146
+ // 需要补2个=
147
+ if ( i == len ) {
148
+ res . push ( this . table [ ( c1 & 0x3 ) << 4 ] ) ;
149
+ res . push ( '==' ) ;
150
+ break ;
151
+ }
152
+ var c2 = utf8 . charCodeAt ( i ++ ) ;
153
+ // 需要补1个=
154
+ if ( i == len ) {
155
+ res . push ( this . table [ ( ( c1 & 0x3 ) << 4 ) | ( ( c2 >> 4 ) & 0x0F ) ] ) ;
156
+ res . push ( this . table [ ( c2 & 0x0F ) << 2 ] ) ;
157
+ res . push ( '=' ) ;
158
+ break ;
159
+ }
160
+ var c3 = utf8 . charCodeAt ( i ++ ) ;
161
+ res . push ( this . table [ ( ( c1 & 0x3 ) << 4 ) | ( ( c2 >> 4 ) & 0x0F ) ] ) ;
162
+ res . push ( this . table [ ( ( c2 & 0x0F ) << 2 ) | ( ( c3 & 0xC0 ) >> 6 ) ] ) ;
163
+ res . push ( this . table [ c3 & 0x3F ] ) ;
164
+ }
165
+
166
+ return res . join ( '' ) ;
167
+ }
168
+
169
+ public static Base64Decode ( str ) {
170
+ if ( ! str ) {
171
+ return '' ;
172
+ }
173
+ var len = str . length ;
174
+ var i = 0 ;
175
+ var res = [ ] ;
176
+ var code1 = 0 ;
177
+ var code2 = 0 ;
178
+ var code3 = 0 ;
179
+ var code4 = 0 ;
180
+ while ( i < len ) {
181
+ code1 = this . table . indexOf ( str . charAt ( i ++ ) ) ;
182
+ code2 = this . table . indexOf ( str . charAt ( i ++ ) ) ;
183
+ code3 = this . table . indexOf ( str . charAt ( i ++ ) ) ;
184
+ code4 = this . table . indexOf ( str . charAt ( i ++ ) ) ;
185
+
186
+ let c1 = ( code1 << 2 ) | ( code2 >> 4 ) ;
187
+ res . push ( String . fromCharCode ( c1 ) ) ;
188
+
189
+ if ( code3 != - 1 ) {
190
+ let c2 = ( ( code2 & 0xF ) << 4 ) | ( code3 >> 2 ) ;
191
+ res . push ( String . fromCharCode ( c2 ) ) ;
192
+ }
193
+ if ( code4 != - 1 ) {
194
+ let c3 = ( ( code3 & 0x3 ) << 6 ) | code4 ;
195
+ res . push ( String . fromCharCode ( c3 ) ) ;
196
+ }
197
+ }
198
+ return this . UTF8ToUTF16 ( res . join ( '' ) ) ;
199
+ }
200
+ }
0 commit comments