天天看點

字元編碼(2)——Base64,ANSI

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>

轉載請注明:部落格園

繼續閱讀