字符编码(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?编码的文本中。