`
wuguowei1314
  • 浏览: 130353 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

图片从数据流转换为字符型,方便网络传输 base64转换 【转】

    博客分类:
  • java
 
阅读更多

ndroid不能直接利用java里的base64类,需要自己定义编写一个编码类,从而达到可以在网络中传输照片的目的,以下就是构建一个编码类型,便于进行网络传输。

 

 

构建一个base64类:

public class base64 {
 
 private static final byte[] encodingTable = { (byte) 'A', (byte) 'B',
   (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G',
   (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L',
   (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q',
   (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V',
   (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', (byte) 'a',
   (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f',
   (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k',
   (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p',
   (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u',
   (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', (byte) 'z',
   (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4',
   (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9',
   (byte) '+', (byte) '/' };

 private static final byte[] decodingTable;

 static {
  decodingTable = new byte[128];
  for (int i = 0; i < 128; i++) {
   decodingTable[i] = (byte) -1;
  }
  for (int i = 'A'; i <= 'Z'; i++) {
   decodingTable[i] = (byte) (i - 'A');
  }
  for (int i = 'a'; i <= 'z'; i++) {
   decodingTable[i] = (byte) (i - 'a' + 26);
  }
  for (int i = '0'; i <= '9'; i++) {
   decodingTable[i] = (byte) (i - '0' + 52);
  }
  decodingTable['+'] = 62;
  decodingTable['/'] = 63;
 }

 public static byte[] encode(byte[] data) {
  byte[] bytes;
  int modulus = data.length % 3;
  if (modulus == 0) {
   bytes = new byte[(4 * data.length) / 3];
  } else {
   bytes = new byte[4 * ((data.length / 3) + 1)];
  }
  int dataLength = (data.length - modulus);
  int a1;
  int a2;
  int a3;
  for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) {
   a1 = data[i] & 0xff;
   a2 = data[i + 1] & 0xff;
   a3 = data[i + 2] & 0xff;
   bytes[j] = encodingTable[(a1 >>> 2) & 0x3f];
   bytes[j + 1] = encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f];
   bytes[j + 2] = encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f];
   bytes[j + 3] = encodingTable[a3 & 0x3f];
  }
  int b1;
  int b2;
  int b3;
  int d1;
  int d2;
  switch (modulus) {
  case 0: /* nothing left to do */
   break;
  case 1:
   d1 = data[data.length - 1] & 0xff;
   b1 = (d1 >>> 2) & 0x3f;
   b2 = (d1 << 4) & 0x3f;
   bytes[bytes.length - 4] = encodingTable[b1];
   bytes[bytes.length - 3] = encodingTable[b2];
   bytes[bytes.length - 2] = (byte) '=';
   bytes[bytes.length - 1] = (byte) '=';
   break;
  case 2:
   d1 = data[data.length - 2] & 0xff;
   d2 = data[data.length - 1] & 0xff;
   b1 = (d1 >>> 2) & 0x3f;
   b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f;
   b3 = (d2 << 2) & 0x3f;
   bytes[bytes.length - 4] = encodingTable[b1];
   bytes[bytes.length - 3] = encodingTable[b2];
   bytes[bytes.length - 2] = encodingTable[b3];
   bytes[bytes.length - 1] = (byte) '=';
   break;
  }
  return bytes;
 }

 public static byte[] decode(byte[] data) {
  byte[] bytes;
  byte b1;
  byte b2;
  byte b3;
  byte b4;
  data = discardNonBase64Bytes(data);
  if (data[data.length - 2] == '=') {
   bytes = new byte[(((data.length / 4) - 1) * 3) + 1];
  } else if (data[data.length - 1] == '=') {
   bytes = new byte[(((data.length / 4) - 1) * 3) + 2];
  } else {
   bytes = new byte[((data.length / 4) * 3)];
  }
  for (int i = 0, j = 0; i < (data.length - 4); i += 4, j += 3) {
   b1 = decodingTable[data[i]];
   b2 = decodingTable[data[i + 1]];
   b3 = decodingTable[data[i + 2]];
   b4 = decodingTable[data[i + 3]];
   bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));
   bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));
   bytes[j + 2] = (byte) ((b3 << 6) | b4);
  }
  if (data[data.length - 2] == '=') {
   b1 = decodingTable[data[data.length - 4]];
   b2 = decodingTable[data[data.length - 3]];
   bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));
  } else if (data[data.length - 1] == '=') {
   b1 = decodingTable[data[data.length - 4]];
   b2 = decodingTable[data[data.length - 3]];
   b3 = decodingTable[data[data.length - 2]];
   bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));
   bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));
  } else {
   b1 = decodingTable[data[data.length - 4]];
   b2 = decodingTable[data[data.length - 3]];
   b3 = decodingTable[data[data.length - 2]];
   b4 = decodingTable[data[data.length - 1]];
   bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));
   bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));
   bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);
  }
  return bytes;
 }

 public static byte[] decode(String data) {
  byte[] bytes;
  byte b1;
  byte b2;
  byte b3;
  byte b4;
  data = discardNonBase64Chars(data);
  if (data.charAt(data.length() - 2) == '=') {
   bytes = new byte[(((data.length() / 4) - 1) * 3) + 1];
  } else if (data.charAt(data.length() - 1) == '=') {
   bytes = new byte[(((data.length() / 4) - 1) * 3) + 2];
  } else {
   bytes = new byte[((data.length() / 4) * 3)];
  }
  for (int i = 0, j = 0; i < (data.length() - 4); i += 4, j += 3) {
   b1 = decodingTable[data.charAt(i)];
   b2 = decodingTable[data.charAt(i + 1)];
   b3 = decodingTable[data.charAt(i + 2)];
   b4 = decodingTable[data.charAt(i + 3)];
   bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));
   bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));
   bytes[j + 2] = (byte) ((b3 << 6) | b4);
  }
  if (data.charAt(data.length() - 2) == '=') {
   b1 = decodingTable[data.charAt(data.length() - 4)];
   b2 = decodingTable[data.charAt(data.length() - 3)];
   bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));
  } else if (data.charAt(data.length() - 1) == '=') {
   b1 = decodingTable[data.charAt(data.length() - 4)];
   b2 = decodingTable[data.charAt(data.length() - 3)];
   b3 = decodingTable[data.charAt(data.length() - 2)];
   bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));
   bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));
  } else {
   b1 = decodingTable[data.charAt(data.length() - 4)];
   b2 = decodingTable[data.charAt(data.length() - 3)];
   b3 = decodingTable[data.charAt(data.length() - 2)];
   b4 = decodingTable[data.charAt(data.length() - 1)];
   bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));
   bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));
   bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);
  }
  return bytes;
 }

 private static byte[] discardNonBase64Bytes(byte[] data) {
  byte[] temp = new byte[data.length];
  int bytesCopied = 0;
  for (int i = 0; i < data.length; i++) {
   if (isValidBase64Byte(data[i])) {
    temp[bytesCopied++] = data[i];
   }
  }
  byte[] newData = new byte[bytesCopied];
  System.arraycopy(temp, 0, newData, 0, bytesCopied);
  return newData;
 }

 private static String discardNonBase64Chars(String data) {
  StringBuffer sb = new StringBuffer();
  int length = data.length();
  for (int i = 0; i < length; i++) {
   if (isValidBase64Byte((byte) (data.charAt(i)))) {
    sb.append(data.charAt(i));
   }
  }
  return sb.toString();
 }

 private static boolean isValidBase64Byte(byte b) {
  if (b == '=') {
   return true;
  } else if ((b < 0) || (b >= 128)) {
   return false;
  } else if (decodingTable[b] == -1) {
   return false;
  }
  return true;
 }
}

 

 

转换的实例为:

public static String ReadFile(File file) {
  String result = "";
  FileInputStream fis = null;
  byte[] xml = null;
  try {
   if (file != null) {
    fis = new FileInputStream(file);
    if (fis != null) {
     int len = fis.available();
     xml = new byte[len];
     fis.read(xml);
    }
    base64 enc = new base64();
    byte[] bb = enc.encode(xml);
    result = new String(bb,"UTF-8");
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if(fis!=null){
    try {
     fis.close();
     fis = null;
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
  return result;
 }

此时的result即为转换后的字符型,解析的时候按照java的base64解析即可

分享到:
评论

相关推荐

    1345个易语言模块

    BASE64编解码模块.ec Bios.ec Bios 信息.ec BMP加密数据.ec BMP滤镜模块.ec BOX.EC BPL专用更新模块.ec BPL综合模 块.ec BPL高级模块.ec ButtonEx.ec bzfec.ec cards.ec change.ec CM.ec commodity.ec coolp.ec Cool...

    1350多个精品易语言模块

    BASE64编解码模块.ec Bios.ec Bios 信息.ec BMP加密数据.ec BMP滤镜模块.ec BOX.EC BPL专用更新模块.ec BPL综合模 块.ec BPL高级模块.ec ButtonEx.ec bzfec.ec cards.ec change.ec CM.ec commodity.ec coolp.ec Cool...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例020 从控制台接收输入字符 31 实例021 重定向输出流实现程序日志 31 实例022 自动类型转换与强制类型转换 33 2.2 运算符 34 实例023 加密可以这样简单(位运算) 34 实例024 用三元运算符判断奇数和偶数 35 实例...

    WAP 无线应用协议

    6.4.2 运算符数据类型的转换规则 136 6.4.3 运算符和类型转换的总结 138 6.5 WMLScript 文法 139 6.5.1 上下文无关文法 139 6.5.2 WMLScript词汇文法 142 6.5.3 WMLScript 句子文法 146 6.5.4 数字字符串的文法 150 ...

    java-servlet-api.doc

    当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检杳什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。 绪言 这是一份关于2.1版...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    3. 关系结构模型:关系式数据结构把一些复杂的数据结构归结为简单的二元关系(即二维表格形式)。常见的有Oracle、mssql、mysql等 二、 主流数据库 数据库名 公司 特点 工作环境 mssql 微软 只能能运行在windows平台,...

    【。net 专业】 面试题

    答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下...

    vc++ 应用源码包_3

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    asp.net知识库

    常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN...

    vc++ 应用源码包_1

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_2

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_6

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_5

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    超级有影响力霸气的Java面试题大全文档

    (s1+1运算结果是int型,需要强制转换类型) short s1 = 1; s1 += 1;(可以正确编译) 29、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? Math.round(11.5)==12 Math.round(-11.5)==-11 round方法返回...

Global site tag (gtag.js) - Google Analytics