字符编码(2)——Base64,ANSI

简介: Base64是什么? Base64编码的用途是为了传输和传输安全(其实并不太安全)。 它的算法是:每3个字节(每字节8bit),转换为4个6bit的字节(一个字节应该是8bit,所以前2位补0),然后每个6位前2位(高位)被2个零。

Base64是什么?

Base64编码的用途是为了传输和传输安全(其实并不太安全)。

它的算法是:每3个字节(每字节8bit),转换为46bit的字节(一个字节应该是8bit,所以前2位补0),然后每个6位前2位(高位)被2个零。例如:

xxxxxxxx yyyyyyyy xxxxyyyy这里转换前的3个字节,然后,每6位分到一个字节中:

xxxxxx xxyyyy yyyyxx xxyyyy

然后高位补0

00xxxxxx 00xxyyyy 00yyyyxx 00xxyyyy

其中xy是二进制的01,然后再按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两部分。第一部分的Hel3个字节,它的二进制格式为(可以查ascii表,也可以由上一篇中给出的方法求):010010000110010101101100

然后分为46位:010010 000110 010101 101100

然后高位补000010010 00000110 00010101 00101100,然后换算为10进制为18 6 21 44

然后与码表对应替换:SGVs

 

下边对后2个字节进行编码。因为base64要求8*3——6*4,然后才进行下一步计算。这里只有2个字节,那应该对其补,补就是用=号来替换。

开始:lo的二进制为0110110001101111

因为不够24位,所以分为36位字节011011 000110 111100

011011 000110 11110010进制数为:27 6 60,然后再补一个=号就是

bG8=

与上边的连起来就是SGVs bG8=

 

在程序中验证,这个是正确的。

 

再做一个汉字语句的base64编码:赵。

utf-8编码下,它的二进制是:111010001011010110110101

它有3个字节,分为4个字节:111010 001011 010110 110101,补000111010 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码内(ascii127之内)。那么对于编码环境下不存在的字符怎么样处理呢?

ascii环境下,任何大于127的,即U+007Funicode编码127的),则由ascii的问号替换。

然后,问号在unicode值下是63Ascii下也是,这是10进制数),63的二进制是:111111。这是一个字节(Base64编码算法,要补齐3个字节,所以最后要加2个等号),它应该是:00111111,然后每6位分一字节:001111 110000

不足的在后边补0,这个补06位变8位补不是一样的概念。那么这两个8位的10进制数是:

15 48,对应码表就是Pw

然后还要加上2个等号==

最后变成了Pw==

 

ANSI

American National Standards InstituteANSI——美国国家标准局)

为使计算机支持更多语言,通常使用 0x80—0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

 

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
存储 Windows
“浅入深处“编码历史,字符串编码(ASCII, GBK, ANSI, Unicode, UTF-8编码),为什么记事本默认ANSI编码,Unicode和UTF8有什么区别
“浅入深处“编码历史,字符串编码(ASCII, GBK, ANSI, Unicode, UTF-8编码),为什么记事本默认ANSI编码,Unicode和UTF8有什么区别
142 0
|
iOS开发
Unicode 与 UTF-8 编码的转换
Unicode 与 UTF-8 编码的转换
Unicode 与 UTF-8 编码的转换
ANSI - Unicode - UTF8 转换
ANSI - Unicode - UTF8 转换
100 0
|
Web App开发 存储 Windows
字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识。不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识。
1900 0
|
存储 算法 Java
【字符编码】字符编码 && Base64编码算法
  在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法,然后,这个问题一直放着,想找个机会解决。于是乎,终于逮到机会,开始下手。
238 0
【字符编码】字符编码 && Base64编码算法
|
存储 自然语言处理
最基础的ASCII、Unicode、UTF-8一起来多了解点
最基础的ASCII、Unicode、UTF-8一起来多了解点
252 0
最基础的ASCII、Unicode、UTF-8一起来多了解点
|
Java
Java中的编码问题 UNICODE GBK ASCII等
Java中的编码问题 UNICODE GBK ASCII等
123 0
|
存储 算法 Java
Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解
Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解
397 0
|
MySQL 关系型数据库 Java
MySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码)
MySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码) 前段时间做项目遇到APP评论中有 emoji 表情符号,结果导致插入 MySQL 数据库失败,时隔好久了,现在整理一下。
3377 0