Base64初探

1. 什么是base64

base64是一种使用64个可读字符的一种编码方式
  64个字符如下:
   (a~z)26个小写字母
   (A~Z)26
   +:加号
   /:斜杠

Base64初探

2. base64原理

首先说说相关编码位数:Hex(十六进制)以4位为一组,而base64以6位为一组 这里的位指的是二进制位

base64将三个字符(3*8位)转化为4个字符(4*6位),文本不足3个字符,对转化6位字符后,后面的剩余的二进制位可能是2位或者4位(因为8X/6余数为2或者4),然后进行补0(补到一共6位,因为base64是以6位为单位)。最后还需加=号,缺少2个二进制位就补一个=号,缺少4个就补充两个==。没有理解的多看看下面的例子。

具体对于转换后余几位情况转换如下(这里主要针对英文,中文转换具体得看中文编码):

1.不需要补位

原文: p h p

对应ASCII: 01110000 01101000 01110000

每6位分割: 011100 000110 100001 110000 |

对应10进制值: 28 6 33 48

Base64对应的字符:c G h w

最后php=cGhw(base64)

2.需要补充四个二进制位

原文: r a n l

ASCII值:01110010 01100001 01101110 01101100

每6位分割:011100 100110 000101 101110 | 011011 00 0000 xxxxxx xxxxxx |

对应10进制值:28 38 5 46 27 0 = = 对应base64字符: c m F u b A = =

结果: ranl=cmFubA==(base64)

3.需要补充两个二进制位

原文 h a c k e

ASCII值: 01101000 01100001 01100011 01101011 01100101

每6位分割: 011010 000110 000101 100011 | 011010 110110 0101 00 xxxxxx |

对应10进制值: 26 6 5 35 26 54 20 =

对应base64字符: a G F j a 2 U =

结果 hacke=aGFja2U=(base64)

3. base64常见用途

1.传输不可见字符(128~255)不方便,容易出错。这里的不可见字符是正对ascii码(0~127)

2.web传输小图片(图片上传与图片显示):利用浏览器直接解析base64或使用js解析,避免多次请求。格式如下

2.1web后台生成/解析字符串

(1):图片生成base64字符串 byte[] data = null;

// 读取图片字节数组
    try {
        InputStream in = new FileInputStream(imgFilePath);
        data = new byte[in.available()];
        in.read(data);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    // 对字节数组Base64编码
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(data);// 返回Base64编码过的字节数组字符串

(2):解析

// 对字节数组Base64解码
    if (imgStr == null) // 图像数据为空
        return false;
    BASE64Decoder decoder = new BASE64Decoder();
    try {
        // Base64解码
        byte[] bytes = decoder.decodeBuffer(imgStr);
        for (int i = 0; i < bytes.length; ++i) {
            if (bytes[i] < 0) {// 调整异常数据
                bytes[i] += 256;
            }
        }
        // 生成jpeg图片
        OutputStream out = new FileOutputStream(imgFilePath);
        out.write(bytes);
        out.flush();
        out.close();
        return true;
    } catch (Exception e) {
        return false;
    }
}

附属图片:

Base64初探

参考文章:

上一篇:戴尔-EMC联邦:存储业务该如何处理?


下一篇:医疗大数据是未来