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. android textview 中超出屏幕宽度的字符 省略号显示
  2. Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值
  3. 处理固定宽度下的长字符串绘制(Android)
  4. Android EditText的输入监听,输入字符的动态获取
  5. Android 特殊字符转义
  6. android图片压缩并转为base64字符串
  7. android中限制EditText中输入指定字符

随机推荐

  1. android 布局特殊的属性介绍
  2. Android中shape属性详解:(设置圆角、设置渐
  3. 使用Bottom Navigation Activity实现Andr
  4. AndroidMenifest.xml中android:sharedUse
  5. Android属性动画源代码解析(超详细)
  6. This Android SDK requires Android Deve
  7. Android Robotium自动化测试入门
  8. [Android Training视频系列]1.1 Creating
  9. 修改Button的样式!
  10. android:layout_gravity 和 android:grav