Android 传输数据时Base64编码算法详解

Android采用android.util.Base64源代码

向服务器上传一张图片,要求把图片转化成图片流放在json字符串里传输。类似{“name”:”lking”,”age”:”20”,”headpic”:”图片流(Base64编码的图片流字符)”}

一、什么是Base64算法?

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一。

Base64编码本质是一种将二进制数据转成文本数据的方案。

对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在A-Z,a-z,0-9,+,/这个64个字符中找到对应的字符,最终得到一个文本字符串。

基本规则:

1. 标准Base64只有64个字符(A-Z,a-z,0-9,+,/)以及用作后缀等号。

2. Base64是把3个字节变成4个可打印字符,所以Base64编码后的字符串一定能被4整除(不算用作后缀的等号)。

3. 等号一定用作后缀,且数目一定是0个、1个或者2个。这是因为如果原文长度不能被3整除,Base64要在后面添加\0凑齐3N位。为了正确还原,添加了几个\0就加上几个等号,所以添加等号的数目只能是0、1、2。

二、Base64编码的用处

主要不是加密,而是把一些二进制数转成普通字符用于网络传输。

三、Base64具体实现

编码步骤:先将要进行编码的数据转化成二进制形式,然后进行Base64编码,最后进行网络传输。

解码步骤:先将要进行解码的数据转化成二进制形式,然后进行Base64解码,解码后将数据进行格式转化。

1) 字符串进行Base64编码

String encodedStr = Base64.encodeToString("lking".getBytes(), Base64.DEFAULT);

Log.e("LKing", "Base64编码---->" + encodedStr );

2) 字符串进行Base64解码

String decodedStr = new String(Base64.decode(encodedStr ,Base64.DEFAULT));

Log.e("LKing", "Base64解码---->" + decodedStr );

 

3) 对文件进行Base64编码

File file = new File("/storage/emulated/0/lking.txt");
FileInputStream inputStream = null;
try{
    inputStream  = new FileInputStream(file)
    byte[] buffer = new byte[(int)file.length()];
    inputStream.read(buffer);
    inouStream.close();
    encodeStr = Base64.encodeToString(buffer,Base64.DEFAULT);
    Log.e("LKing","Base64文件编码---->"+encodeStr);
}catch(Exception e){
    e.printStackTrace();
}

4) 对文件进行Base64解码

File desFile = new File("/storage/emulated/0/lking_enc.txt");
FileOutputStream fos = null;
try{
    Byte[] decodeBytes = Base64.decode(encodeStr.getBytes(),Base64.DEFAULT);
    fos = new FileOutputStream(desFile);
    fos.write(decodeBytes);
    fos.close();
}catch(Exception e){
    e.printStackTrace();
}

 

5) 对图像进行Base64编码

public String bitmap2String(Bitmap bitmap){
    //Bitmap转换成字符串
    String str = null;
    ByteArrayOutputStream bStream = new ByteArrayOutputStream ();
    bitmap.compress(Bitmap.CompressFormat.PNG,100,bStream);
    byte[] bytes = bStream.toByteArray();
    str = Base64.encodeToString(bytes,Base64.DEFAULT);
    return str;
}

6) 对图像进行Base64解码

public Bitmap str2Bitmap(String str){
    //将字符串转换成Bitmap类型
    Bitmap bitmap = null;
    try{
        byte[] bitmapByte;
        bitmapByte = Base64.decode(str,Base64.DEFAULT);
        bitmap = BitmapFactory.decodeByteArray(bitmapByte,0,bitmapByte.length);
    }catch(Exception e){
        e.printStackTrace();
    }
    return bitmap;
}

四、Base64.Default参数说明

无论编码还是解码都会有一个参数Flags,Android提供了以下几种:

1. DEFAULT:使用默认的方法来加密。

2. NO_PADDING:略去加密字符串最后的=

3. NO_WRAP:略去所有的换行符(设置后CRLF就没有用了)

4. CRLF:Win风格的换行符,意思就是使用CRLF这一对作为一行的结尾而不是Unix风格的LF。

5. URL_SAFE:加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体就是以-和_取代+和/

更多相关文章

  1. Hello Android(安卓)- 进行android junit 测试
  2. Android中使用SQlite进行数据操作
  3. Android(安卓)编码规范
  4. Android(安卓)调用系统Email --多附件
  5. Android刷机原理之recovery内部工作原理
  6. Android团队如何进行情感设计
  7. [Android]去除程序中广告的好方法:告诉广告没有网络连接
  8. android 原生的 MediaExtractor,MediaCodec 和 opengl 对视频进
  9. Android(安卓)RIL结构分析与移植

随机推荐

  1. 仿春雨医生 安卓app(android)
  2. 二、ANDROID命令详解
  3. android的启动过程
  4. android交叉编译工具链接下载
  5. 高级组件之进度条
  6. android 底部Tab添加水波纹效果
  7. 错误parsing XML: ubound prefix
  8. 【进阶篇】Android学习笔记――TextInput
  9. Android毕设之Fragment+TabHost(三)
  10. Android(安卓)动画之TranslateAnimation