zoukankan      html  css  js  c++  java
  • Byte[]和BASE64之间的转换

    一、  BASE64编码

    byte[]中的元素当做无符号八位整数转换成只含有64个基本字符的字符串,这些基本字符是:

    l         大写的A-Z

    l         小写的a-z

    l         数字0-9

    l         '+' '/'

     

    64个字符构成BASE64的字符集。‘=’,为填充字符,结尾处可以填充0-2个填充字符

     

    Base64是将原文按照每 3 个字节一组分开,这个 3 字节组中的每一组将被按照位分解成 4 个部分,每个部分 6 个位,在这 4 个部分的每个部分高位加上 2 0构成一个新的 4 字节组,新的字节组中,每个字节只有 6 位,能表示64个值。

    在原文在转换为BASE64编码时,试是以3个字节为一组转换成4字节一组的BASE64编码。如果原文不是三字节的倍数,可能多出一个字节和两个字节,分别会被转为2字节和3字节的BASE64编码,这时编码系统应该在形成的BASE64编码最后添加上填充符=,保证BASE64编码长度是4的倍数。所以在BASE64编码后添加的填充符=可能为0-2个。

    BASE64编码对照表如下:

    Value

    Encoding

    Value

    Encoding

    Value

    Encoding

    Value

    Encoding

    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

    /

     

    Byte[]BASE64之间的转换纯粹就是表现形式的一种转换,它们之间有直接的对应关系,不涉及到使用何种代码页的问题,BASE64表达的也是字节流。
    实际应用中,dotnet提供的两个主要的BASE64方法Convert.ToBase64String Convert.FromBase64String,并不是把Byte[]直接转成相应的BASE64的字节流,而是转换成unicode的等价字符串,就是base64的值对应的字符在unicode的等价字符。
    如果要把
    BASE64的等价字符串转成Byte[],还是需要指定一个代码页然后按照指定的编码转成Byte[]


    二、  Byte[]BASE64之间的转换操作

    static void Main(string[] args)

    {

        string factString = "中华人民共和国";

        byte[] myByte;

        string Base64Str;

        //先把字符串按照utf-8的编码转换成byte[]

        Encoding myEncoding = Encoding.GetEncoding("utf-8");

        //myByte中获得这样的字节数组:228,184,173,229,141,142,228,186,186,230,176,145,229,133,177,229,146,140,229,155,189

        myByte = myEncoding.GetBytes(factString);

        //byte[]转成base64编码,这个例子形成的base64编码的unicode等价字符串:"5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9"

        Base64Str = Convert.ToBase64String(myByte);

        //再从base64编码转成byte[],又恢复为字节数组:228,184,173,229,141,142,228,186,186,230,176,145,229,133,177,229,146,140,229,155,189

        myByte = Convert.FromBase64String(Base64Str);

        //用同一个Encoding对象把byte[]转成字符串:"中华人民共和国"

        factString = myEncoding.GetString(myByte);

        Console.WriteLine(factString);

    }

  • 相关阅读:
    hdu5289 RMQ+二分
    poj1459 最大流Dinic
    poj2391 最大流+拆点
    poj1087&&hdu1526 最大流
    NOI2004 郁闷的出纳员
    Treap入门(转自NOCOW)
    poj 2892
    vijos 1512
    对拍程序
    poj 3264
  • 原文地址:https://www.cnblogs.com/chnking/p/852669.html
Copyright © 2011-2022 走看看