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


    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/

    转载请注明:博客园

  • 相关阅读:
    【Office】Word排版
    小猪的压力
    SQL SERVER 自定义函数参数数量对调用时参数数量的影响
    工作效率
    C#使用SharpZipLib编辑zip包中内容
    SQL SERVER——自定义函数
    C#字符串编码
    在ASP.NET中启动SQL SERVER缓存
    C#延迟加载
    C#格式化DateTime时间
  • 原文地址:https://www.cnblogs.com/jams742003/p/1696876.html
Copyright © 2020-2023  润新知