• Android Base64编码、包含 base64UrlSafe 转载不错


    来自:https://blog.csdn.net/taoszu/article/details/78765545

    ============================================================

    简介
    Base64编码是一种编码方式,可以把二进制数据编码为可见的字符数据,包含64个字符,A-Z, a-z,0-9,+,/,除此之外还有一个填充字符是后缀等号’=’。
    由于Base64编码是六位一个字符,而一个字节占八位,所以编码的时候如果字节不是三的倍数,需要添加零值,注意,由于一个字节占六位,所以编码之后高两位会补0。
    如Xu
    X u 零值
    01011000 01110101 00000000
    编码后六位一个字符,高两位补0,为WHU=,其中=为零值。

    特性
    标准Base64编码包含64个字符A-Z, a-z,0-9,+,/,=
    url safe的Base64编码将+,/换成-,_
    三个字符会变成四个字符
    解码Base64编码时,遇到=即可知道字符结束
    每76个字符增加一个换行符
    作用
    Base64编码的作用是将不可见字符转为可见字符,因为数据在传输的时候,各个设备处理字符的规则不同,为了避免不可见字符被过滤,采用Base64编码,可以统统转化为可见字符,减少这种情况的发生。
    可以用作编码图片或者附件的源文件,这样可以直接在网页看到图片,而不需将图片放在服务器上。
    代码实现
    java 标准Base64
    String encodeResult = java.util.Base64.getEncoder().encodeToString("???".getBytes());

    System.out.println(encodeResult);

    输出结果为Pz8/
    1
    2
    3
    4
    5
    java url安全Base64
    String encodeResult = java.util.Base64.getUrlEncoder().encodeToString("???".getBytes());

    System.out.println(encodeResult);

    输出结果为Pz8_
    1
    2
    3
    4
    5
    android 实现
    String raw = "???";
    String result = Base64.encodeToString(raw.getBytes(), Base64.NO_WRAP | Base64.NO_PADDING | Base64.URL_SAFE);
    1
    2
    注意
    由于Android的Base64编码是默认换行,因此在进行服务器验证的时候,会出现验证失败的情况,这是由于服务器那边的解码不支持换行符模式,所以编码时需要增加flag标志,android总共有以下几个flag。
    flag种类如下:
    DEFAULT 默认模式
    NO_WRAP 过滤换行符
    NO_PADDING 过滤结束符=
    URL_SAFE 将+,/换成-,_
    CRLF 换行符模式 选中windows而不是unix的lf
    参看源码如下

    do_newline的判断为设置的flag与NO_WRAP进行&操作,如果true则换行否则不换行,结合flag的值和判断的方式我们可以知道通过设置各个flag的|操作既可让flag生效。

    踩坑记录
    在使用OKhttp的时候,传输的参数使用android base64进行编码,而字符刚刚好超过76,导致参数增加换行符,换行符为不可见字符,在OKhttp的参数中为不合法,所以直接报错,在这里需要过滤换行符和使用URL_SAFE的模式。
    参考链接
    Base64编码及应用
    Android Base64
    ————————————————
    版权声明:本文为CSDN博主「少年阿涛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/taoszu/article/details/78765545

  • 相关阅读:
    最新Linux系统Ubuntu16.04搭建HUSTOJ(LAMP环境)
    deepin下codeblocks更改调试终端
    UVA
    POJ3436 ACM Computer Factory【EK算法】
    HDU4738 Caocao's Bridges【强连通】
    HDU4685 Prince and Princess【强连通】
    HDU4635 Strongly connected【强连通】
    POJ3177 Redundant Paths【双连通分量】
    HDU1233 还是畅通工程【最小生成树】
    3D正方体
  • 原文地址:https://www.cnblogs.com/del88/p/15828849.html
Copyright © 2020-2023  润新知