Base64编码的Java语言实现

2016-02-19 13:25 7 1 收藏

下面图老师小编要向大家介绍下Base64编码的Java语言实现,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - 编程语言 】


  import Java.io.*;
  
  public class MIMEBase64 {
  /*
  这是个简单的Base64编码程序
  作者:Roc Chen rocanny@163.com
  Base64 使用US-ASCII子集的65个字符, 每个字符用6位表示
  因此"m"的Base64值为38, 二进制形式是 100110.
  
  对于文本串,编码过程如下。例如"men":
  
  先转成US-ASCII值.
  
  "m"十进制 109
  "e"十进制 101
  "n"十进制 110
  
  二进制 :
  
  m 01101101
  e 01100101
  n 01101110
  
  三个8位连起来是24位
  011011010110010101101110
  
  然后分成4个6位
  011011 010110 010101 101110
  
  现在得到4个值,十进制为
  27 22 21 46
  
  对应的 Base64 字符是 :
  b W V u
  
  编码总是基于3个字符,从而产生4个Base64字符。
  假如只剩1或2个字符,使用非凡字符"="补齐Base64的4字。
  如,编码"me"
  
  01101101 01100101
  0110110101100101
  011011 010110 0101
  111111 (与,补足6位)
  011011 010110 010100
  b W U
  b W U = ("=" 补足4字符)
  
  于是 "bWU=" 就是"me"的Base64值.
  
  再如编码 "m"
  
  01101101
  011011 01
  111111
  011011 010000
  b Q = =
  于是 "bQ==" 就是"m"的Base64值.
  
  值得注重的是,MIME规定一行最多76个字符.
  
  */
  
  static String BaseTable[] = {
  "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P",
  "Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f",
  "g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v",
  "w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"
  };
  
  
  public static void encode(String filename, BufferedWriter out) {
  try {
  File f = new File(filename);
  FileInputStream fin = new FileInputStream(filename);
  
  // 读文件到BYTE数组
  byte bytes[] = new byte[(int)(f.length())];
  int n = fin.read(bytes);
  
  if (n 1) return; // 没有内容
  
  byte buf[] = new byte[4]; // base64 字符数组
  
  int n3byt = n / 3; // 3 bytes 组数
  int nrest = n % 3; // 分组后剩余 bytes
  int k = n3byt * 3; //
  int linelength = 0; // 行长
  int i = 0; // 指针
  
  // 3-bytes 分组 ...
  while ( i k ) {
  buf[0] = (byte)(( bytes[i] & 0xFC) 2);
  buf[1] = (byte)(((bytes[i] & 0x03) 4)
  ((bytes[i+1] & 0xF0) 4));
  buf[2] = (byte)(((bytes[i+1] & 0x0F) 2)
  ((bytes[i+2] & 0xC0) 6));
  buf[3] = (byte)( bytes[i+2] & 0x3F);
  send(out, BaseTable[buf[0]]);
  send(out, BaseTable[buf[1]]);
  send(out, BaseTable[buf[2]]);
  send(out, BaseTable[buf[3]]);
  /*
  以上代码可以优化,但会难以理解
  buf[0]= (byte)(b[i] 2);
  buf[1]= (byte)(((b[i] & 0x03) 4)(b[i+1] 4));
  buf[2]= (byte)(((b[i+1] & 0x0F) 2)(b[i+2] 6));
  buf[3]= (byte)(b[i+2] & 0x3F);
  send(out,BaseTable[buf[0]]+BaseTable[buf[1]]+
  BaseTable[buf[2]]+BaseTable[buf[3]]);
  */
  
  if ((linelength += 4) = 76) {
  send(out, "");
  linelength = 0;
  }
  i += 3;
  }
  
  // 处理尾部 ...
  if (nrest==2) {
  // 2 bytes left
  buf[0] = (byte)(( bytes[k] & 0xFC) 2);
  buf[1] = (byte)(((bytes[k] & 0x03) 4)
  ((bytes[k+1] & 0xF0) 4));
  buf[2] = (byte)(( bytes[k+1] & 0x0F) 2);
  }
  else if (nrest==1) {
  // 1 byte left
  buf[0] = (byte)((bytes[k] & 0xFC) 2);
  buf[1] = (byte)((bytes[k] & 0x03) 4);
  }
  if (nrest 0) {
  // 发送尾部
  if ((linelength += 4) = 76) send(out, "

来源:http://www.tulaoshi.com/n/20160219/1604209.html

延伸阅读
其基本模式如下: 分解:把一个问题分解成与原问题相似的子问题 解决:递归的解各个子问题 合并:合并子问题的结果得到了原问题的解。 现在就用递归算法,采用上面的分治思想来解合并排序。                       合并排序(...
CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理解,编程实现简单。用了一天时间研究了CRC的C语言实现,理解和掌握了基本原理和C语言编程。结合自己的理解简单写下来。 1、CRC简介 CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的...
Word-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">#include stdio.h #include stdlib.h typedef int elemType; /************************************************************************/ /*           ...
C语言以其简洁、灵活、表达能力强,产生的目标代码质量高,可移植性好而著称于世。巧妙、灵活地运用C可以进一步挖掘出其潜在的功能。 1、字符数组和字符指针 指针和数组是C最具特色的一部分。数组是占用预分配的连续空间,C语言中对连续空间的访问可以有以下几种方法:加下标构成数组是最直接的;常量字符串也可...
大家可能会想,程序和第三方提供了很多压缩方式,何必自己写压缩代码呢?不错,如GZIP这样的压缩工具很多,可是在某些情况下(如文本内容小且字符不重复),GZIP压缩后会比原始文本还要大。所以在某些特殊情况下用自己的压缩方式可以更优。 大家可能早已忘记了在学校学习的哈夫曼知识,可以先在百度百科了解一下哈夫曼知识:http://baike.baid...

经验教程

944

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部