『壹』 Base64算法原理及实现
Base64算法最开猛历始是被用于解决电子邮件数据传输问题。在早期,由于历史原因问题,电子邮件只允许使用ASCII字符,如果在邮件中出现了非ASCII字符,在通过某些网关进行数据转发的时候,网关会对这些非ASCII字符做出调整,例如,把ASCII码8位二进制码的最高位置为0。此时接收方在收到邮件时就会出现乱码。基于这个原因,产生了Base64算法。
Base64编码的思路说白了,就是把传输数据的每个字节映射成ASCII码表中的某些字符,这样在传输的过程中,就不会出现乱码的问题了。Base64算法定义了一个映射表,如下所示。
 由上表可以看出,之所以称为Base64编码,实际上是把原数据映射成了ASCII码表中的64个字符。但是,64个字符最多能映射的位数是6bit。但是每个数据是8bit的,那怎么转换呢?Base64编码的基本思想: 将原数据每3个字节(24bit)分为一组,然后将这24bit数据按照每6bit一组,重新划分为4组,分组完成之后,再将每每6bit数据为单元进行映射。 
   Base64编码的基本流程如下:
例如,将字符串前世"ABC"进行Base64编码流程如下。
所以,字符串"ABC"经过Base64编码后的数据是"QUJD"。
 从Base64编码的原理可以看到,Base64实际上就是把原来数据中的每3个字节一组进行Base64编码转换,编码之后变成4个Base64字符。但是如果原文数据长度不是3的整数倍的时候该怎么办呢?Base64算法规定,如果待加密数据不是3的整数倍,就在原文数据后面补0,直到长度凑够3的整数倍为止,然后再进行Base64编码转换。待编码转换完成之后,在结果末尾补充相同个数的"="。
   例如,将字符串"ABCD"进行Base64编码流程如下。
所以,字符串"ABC"经过Base64编码后的字符串是"QUJDRA=="。
其实这里有个规律,当原文的数据长度除以3余数为0时,编码之后后面没有"=";当余数为1时,后面有两个"=",当余数是2时,后面有一个"=","="的个数也就是补充的字节数。
通过Base64的原理可以看到,Base64编码实际上是把原数据的3个字节映射成了4个字节,所以相比于原数据长度,编码后的长度会增加1/3。这也会降低传输效率。
Get方式和Post方式是Http请求常用的两种方式,某些情况下会要求使用Get方式来传递二进制数据。这时,可以先通过Base64编码来将二进制数据转换成字符串数据。由于符号"+"和符号"/"是不允许出现在Url中的,所以,产生了Url安全的Base64算法,所谓的Url安全的Base64算法,其实主要包含两个方面。
目前,在java中,我们可以通过以下方式来是使用Base64算法。
 在java8之前,JDK官方库中都没有内置Base64算法,其实Base64实现很简单,这个不知道为什么。但是Java8内置了Base64编码器和解码器。
   在Java8中,Base64工具类提供了三种BASE64编解码器:
   1.基本Base64编码
   也就是完全按照标准Base64的映射规则来编解码,不添加任何行标。
 2.Url Base64编码
   JDK标准类库中的Url Base64编码是用"-"和"_"取代了"+"和"/"
 3.MIME Base64编码
   Java类库中还提供了一种格式更友好的Base64编码,这种编码输出每行不超过76字符,并且使用'
'并跟随'
'作为分割。
 4.去除填充符的Base64
   在Java标准类库中,还提供了一种方式来去除编码末尾的"=",就是在构建Encoder 对象后调用withoutPadding()方法,例如:
 Commons Codec是Apache为Java开发者提供的一个开源软件类库,该类库中主要是一些常用的编码工具类包,例如DES、SHA1、MD5、Base64,URL等。在使用该类库之前需要首先在Eclipse中添加依赖。Commons Codec提供了以下Base64编码方式。
   1.基本Base64编码
   Commons Codec和Java标准类库提枝悔搜供给的Base64编码方式是一样的。
 2.Url Base64编码
   Url Base64编码和Java类库也是一样的,把"+"和"/"替换成了"-"和"_",有一个不同的地方是Commons Codec中的Url Base64默认去掉了后面的"=",相当于Java类库中调用了withouPadding方法,例如:
 3.类MIME格式输出
   Commons Codec中也提供了类似于Java类库中的MIME的格式化输出,在Commons Codec中有一个方法:
这里的isChunked置为true,就表示是按照MIME格式输出编码结果。
h
『贰』 怎样将二进制数据转换字符串
1、在VB中没有一种所谓的“真正的二进制”,只有long、integer、byte这样的整数。 2、VB中不支持二进制字符串。只支持16进制字符串,需要在前面加前缀"&H"。 比如:CLng("&HFFFF") 3、如果你想将"1010011101"这样的二进制字符串转换为数值,需要自己写一个函数。 下面是我给你写的一个: Function BinaryValue(ByVal strBin As String) As Long Dim lngOutValue As Long Dim bytBytes() As Byte Dim bytAscii(0 To 255) As Byte Dim lngBytes_Start As Long Dim lngBytes_Length As Long Dim lngBytes_Index As Long bytAscii(49) = 1 bytBytes() = StrConv(strBin, vbFromUnicode) lngBytes_Length = UBound(bytBytes) If lngBytes_Length > 30 Then lngBytes_Start = lngBytes_Length - 30 For lngBytes_Index = lngBytes_Start To lngBytes_Length lngOutValue = lngOutValue + bytAscii(bytBytes(lngBytes_Index)) * 2 ^ (lngBytes_Length - lngBytes_Index) Next BinaryValue = lngOutValue End Function BinaryValue函数可以将31位以下的二进制字符串转换为Long类型整数。 比如下面的用法: MsgBox (BinaryValue(""))
『叁』 java 如何将二进制数据流转换成字符串并保存
private static String bytesToString(String filename) {
		String myreadline = "";
		try {
			// 创建FileReader对象,用来读取字符流
			FileReader fr = new FileReader("userinfo.txt");
			// 缓冲指定文件的输入
			BufferedReader br = new BufferedReader(fr);
			// 定义一个String类型的变量,用来每次读取一行
			while (br.ready()) {
				// 读取一行
				myreadline = myreadline + (myreadline.equals("")?"":"\n") + br.readLine();
				// 在屏幕上输出
				System.out.println(myreadline);
			}
			br.close();
			fr.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return myreadline;
	}
	public static void writerFile(String fileString, String filePath) {
		FileWriter fw;
		try {
			fw = new FileWriter(filePath);
			// 将缓冲对文件的输出
			BufferedWriter bw = new BufferedWriter(fw);
			bw.write(fileString);
			bw.flush();
			bw.close();
			fw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
public static void main(String[] args) throws FileNotFoundException,
			Exception {
		// TODO Auto-generated method stub
		String fileString = bytesToString("D:/workspace/TestStruts2/userinfo.txt");
		writerFile(fileString,"D:/workspace/TestStruts2/test.txt");
	}
『肆』 如何将一个二进制文件转化为字符串
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
 
/*
 * String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组
 * byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组
 * 
 * 编码:把看得懂的变成看不懂的
 * String -- byte[]
 * 
 * 解码:把看不懂的变成看得懂的
 * byte[] -- String
 * 
 * 举例:谍战片(发电报,接电报)
 * 
 * 码表:小本子
 *        字符  数值
 * 
 * 要发送一段文字:
 *        今天晚上在老地方见
 * 
 *        发送端:今 -- 数值 -- 二进制 -- 发出去
 *        接收端:接收 -- 二进制 -- 十进制 -- 数值 -- 字符 -- 今
 * 
 *        今天晚上在老地方见
 * 
 * 编码问题简单,只要编码解码的格式是一致的。
 */
public class StringDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "你好";
 
        // String -- byte[]
        byte[] bys = s.getBytes(); // [-60, -29, -70, -61]
        // byte[] bys = s.getBytes("GBK");// [-60, -29, -70, -61]
        // byte[] bys = s.getBytes("UTF-8");// [-28, -67, -96, -27, -91, -67]
        System.out.println(Arrays.toString(bys));
 
        // byte[] -- String
        String ss = new String(bys); // 你好
        // String ss = new String(bys, "GBK"); // 你好
        // String ss = new String(bys, "UTF-8"); // ???
        System.out.println(ss);
    }
}
『伍』 二进制流怎么转化成字符串delphi
ObjectBinaryToText过程将二进制流中存储的部件转化为基于文本的表现形式,这样 ... 可以用文本编辑器进行查找和替代操作,最后可以将文本再转化成二进制流中的部件。 ... 写入属性名ConvertValue过程根据属性的类型将属性值转化为字符串,然后写入流中。