Base64是什麼?
Base64編碼的用途是為了傳輸和傳輸安全(其實并不太安全)。
它的算法是:每3個位元組(每位元組8bit),轉換為4個6bit的位元組(一個位元組應該是8bit,是以前2位補0),然後每個6位前2位(高位)被2個零。例如:
xxxxxxxx yyyyyyyy xxxxyyyy這裡轉換前的3個位元組,然後,每6位分到一個位元組中:
xxxxxx xxyyyy yyyyxx xxyyyy
然後高位補0
00xxxxxx 00xxyyyy 00yyyyxx 00xxyyyy
其中xy是二進制的0和1,然後再按base64碼表進行替換(base64,基本的64個碼,=号不在其内)
0 A
16 Q
32 g
48 w
1 B
17 R
33 h
49 x
2 C
18 S
34 i
50 y
3 D
19 T
35 j
51 z
4 E
20 U
36 k
52 0
5 F
21 V
37 l
53 1
6 G
22 W
38 m
54 2
7 H
23 X
39 n
55 3
8 I
24 Y
40 o
56 4
9 J
25 Z
41 p
57 5
10 K
26 a
42 q
58 6
11 L
27 b
43 r
59 7
12 M
28 c
44 s
60 8
13 N
29 d
45 t
61 9
14 O
30 e
46 u
62 +
15 P
31 f
47 v
63 /
從碼表中可以得知,base64編碼後的字串隻包含在小寫字母,數字,還有+/這2個特殊字元。
還有一些擴充的base64用法。例如用于url傳遞的其中把+号和左斜線換成了*和-
現在以Hello這個單詞來測試一下,之前,先通過.net提供的base64轉換方法得到它的base64編碼。
public static string Base64Encoding(this string selfChar,Encoding encoding)
{
byte[] bb = selfencoding.GetBytes(selfChar);
return Convert.ToBase64String(bb);
}
在Ascii編碼環境下
Hello這個單詞有5個字母,就是5個位元組,那麼可以把它分為Hel lo兩部分。第一部分的Hel是3個位元組,它的二進制格式為(可以查ascii表,也可以由上一篇中給出的方法求):010010000110010101101100
然後分為4個6位:010010 000110 010101 101100
然後高位補0:00010010 00000110 00010101 00101100,然後換算為10進制為18 6 21 44
然後與碼表對應替換:SGVs
下邊對後2個位元組進行編碼。因為base64要求8*3——6*4,然後才進行下一步計算。這裡隻有2個位元組,那應該對其補,補就是用=号來替換。
開始:lo的二進制為0110110001101111
因為不夠24位,是以分為3個6位位元組011011 000110 111100
011011 000110 111100,10進制數為:27 6 60,然後再補一個=号就是
bG8=
與上邊的連起來就是SGVs bG8=
在程式中驗證,這個是正确的。
再做一個漢字語句的base64編碼:趙。
在utf-8編碼下,它的二進制是:111010001011010110110101
它有3個位元組,分為4個位元組:111010 001011 010110 110101,補0:00111010 00001011 00010110 00110101
10進制是:58 11 22 53
碼表:6LW1。
在GB2312環境下的64位編碼是怎樣的?
“趙”字的gb2312編碼環境下的位元組有2個,它的二進制位是:1101010111010100,分為6位的:
110101 011101 010000
對應的10進制是:53 29 16,對應碼表是1dQ,然後補=号就是
1dQ=
在Ascii環境下的64位編碼是怎樣的?
“趙”字不在Ascii碼内(ascii在127之内)。那麼對于編碼環境下不存在的字元怎麼樣處理呢?
在ascii環境下,任何大于127的,即U+007F(unicode編碼127的),則由ascii的問号替換。
然後,問号在unicode值下是63(Ascii下也是,這是10進制數),63的二進制是:111111。這是一個位元組(按Base64編碼算法,要補齊3個位元組,是以最後要加2個等号),它應該是:00111111,然後每6位分一位元組:001111 110000
不足的在後邊補0,這個補0與6位變8位補不是一樣的概念。那麼這兩個8位的10進制數是:
15 48,對應碼表就是Pw,
然後還要加上2個等号==
最後變成了Pw==
ANSI
American National Standards Institute(ANSI——美國國家标準局)
為使計算機支援更多語言,通常使用 0x80—0xFF 範圍的 2 個位元組來表示 1 個字元。比如:漢字 '中' 在中文作業系統中,使用 [0xD6,0xD0] 這兩個位元組存儲。
不同的國家和地區制定了不同的标準,由此産生了 GB2312, BIG5, JIS 等各自的編碼标準。這些使用 2 個位元組來代表一個字元的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文作業系統下,ANSI 編碼代表 JIS 編碼。
不同 ANSI 編碼之間互不相容,當資訊在國際間交流時,無法将屬于兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園