`
asuwing712
  • 浏览: 5720 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类

String2BASE64

阅读更多
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

比如某一字符串转成字节码为:
11011001 01101010 00101100
110110010110101000101100
00110110 00010110 00101000 00101100

把8位的字节连成一串110110010110101000101100
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。

当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的在后面用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。
如果余1,就补“==”
如果余2,就补“=”

下面是具体的代码实现:

Java代码 
import sun.misc.BASE64Decoder;   
  
public class Base64Test {   
  
    private final static String CODE_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";   
    private final static int ORGINAL_LEN = 8;   
    private final static int NEW_LEN = 6;   
       
    public static void main(String[] args){        
        System.out.println(encodeBase64("honda418"));   
        System.out.println(getBASE64("honda418"));         
    }   
       
    /**  
     * 把str转换成Base64编码  
     * @param str  
     * @return  
     */  
    public static String encodeBase64(String str){   
        String binStr = getBinStr(str);   
           
        int oldByteLen = binStr.length() / ORGINAL_LEN;     //原始字节数,数字字母占1个,中文占2个   
        int newByteLen = oldByteLen * 4 / 3;    //新的字节数   
           
        String appendStr = "";                  //最后面该不该加“=”   
           
        switch(oldByteLen % 3){   
        case 0 : break;   
        case 1 : newByteLen = newByteLen + 1; appendStr = "=="; break;   
        case 2 : newByteLen = newByteLen + 1; appendStr = "="; break;   
        }   
           
        StringBuilder base64Str = new StringBuilder("");   
        for(int k = 0; k < newByteLen; k++){   
            String bin = "";   
            // 二进制字符串按照6个一组分隔   
            if((k+1) * NEW_LEN > binStr.length()){   
                bin = binStr.substring(k * NEW_LEN, binStr.length());   
            }else{   
                bin = binStr.substring(k * NEW_LEN, (k+1) * NEW_LEN);      
            }   
               
            int intval = Integer.parseInt(bin, 2);  //二进制转成十进制   
            if(bin.length() < NEW_LEN){   
                /**  
                 * 不足6位时右侧补0  
                 * 0101  -- > 010100 (补2个0)  
                 * 10    -- > 100000 (补4个0)  
                 */  
                intval <<= NEW_LEN - bin.length();   
            }   
            //从码表里面查找当前字符,返回字符在码表中的位置   
            base64Str = base64Str.append(CODE_STR.charAt(intval));   
        }   
        base64Str = base64Str.append(appendStr);   
        return base64Str.toString();   
    }   
       
    /**  
     * 把字符串转行成二进制,再把二进制拼接起来  
     * 返回拼接后的二进制字符串  
     * @param str  
     * @return  
     */  
    public static String getBinStr(String str){   
        // 采用默认语言环境的 character set。   
        byte[] b = str.getBytes();   
        StringBuilder sb = new StringBuilder("");   
        for(byte c : b){   
            String tmpStr = Integer.toBinaryString(c);   
            System.out.println(tmpStr);   
            if(tmpStr.length() > ORGINAL_LEN){   
                //截取, 如: "1111111111111111111111111010101" to "11010101"   
                sb.append(tmpStr.substring(tmpStr.length() - ORGINAL_LEN, tmpStr.length()));   
            }else if(tmpStr.length() < ORGINAL_LEN){   
                //前补0, 如: "110011" to "00110011"   
                int i = 0;   
                while(tmpStr.length() + i < ORGINAL_LEN){   
                    i ++;   
                    sb.append("0");   
                }   
                sb.append(tmpStr);   
            }else{   
                sb.append(tmpStr);   
            }   
        }   
        return sb.toString();   
    }   
       
       
    // 用SUN自带的进行BASE 64编码   
    public static String getBASE64(String s) {   
        if (s == null)   
            return null;   
        return (new sun.misc.BASE64Encoder()).encode(s.getBytes());   
    }   
  
    // 将 BASE64 编码的字符串 s 进行解码   
    public static String getFromBASE64(String s) {   
        if (s == null)   
            return null;   
        BASE64Decoder decoder = new BASE64Decoder();   
        try {   
            byte[] b = decoder.decodeBuffer(s);   
            return new String(b);   
        } catch (Exception e) {   
            return null;   
        }   
    }   
}  

import sun.misc.BASE64Decoder;

public class Base64Test {

	private final static String CODE_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	private final static int ORGINAL_LEN = 8;
	private final static int NEW_LEN = 6;
	
	public static void main(String[] args){		
		System.out.println(encodeBase64("honda418"));
		System.out.println(getBASE64("honda418"));		
	}
	
	/**
	 * 把str转换成Base64编码
	 * @param str
	 * @return
	 */
	public static String encodeBase64(String str){
		String binStr = getBinStr(str);
		
		int oldByteLen = binStr.length() / ORGINAL_LEN; 	//原始字节数,数字字母占1个,中文占2个
		int newByteLen = oldByteLen * 4 / 3;	//新的字节数
		
		String appendStr = "";					//最后面该不该加“=”
		
		switch(oldByteLen % 3){
		case 0 : break;
		case 1 : newByteLen = newByteLen + 1; appendStr = "=="; break;
		case 2 : newByteLen = newByteLen + 1; appendStr = "="; break;
		}
		
		StringBuilder base64Str = new StringBuilder("");
		for(int k = 0; k < newByteLen; k++){
			String bin = "";
			// 二进制字符串按照6个一组分隔
			if((k+1) * NEW_LEN > binStr.length()){
				bin = binStr.substring(k * NEW_LEN, binStr.length());
			}else{
				bin = binStr.substring(k * NEW_LEN, (k+1) * NEW_LEN);	
			}
			
			int intval = Integer.parseInt(bin, 2);	//二进制转成十进制
			if(bin.length() < NEW_LEN){
				/**
				 * 不足6位时右侧补0
				 * 0101  -- > 010100 (补2个0)
				 * 10    -- > 100000 (补4个0)
				 */
				intval <<= NEW_LEN - bin.length();
			}
			//从码表里面查找当前字符,返回字符在码表中的位置
			base64Str = base64Str.append(CODE_STR.charAt(intval));
		}
		base64Str = base64Str.append(appendStr);
		return base64Str.toString();
	}
	
	/**
	 * 把字符串转行成二进制,再把二进制拼接起来
	 * 返回拼接后的二进制字符串
	 * @param str
	 * @return
	 */
	public static String getBinStr(String str){
		// 采用默认语言环境的 character set。
		byte[] b = str.getBytes();
		StringBuilder sb = new StringBuilder("");
		for(byte c : b){
			String tmpStr = Integer.toBinaryString(c);
			System.out.println(tmpStr);
			if(tmpStr.length() > ORGINAL_LEN){
				//截取, 如: "1111111111111111111111111010101" to "11010101"
				sb.append(tmpStr.substring(tmpStr.length() - ORGINAL_LEN, tmpStr.length()));
			}else if(tmpStr.length() < ORGINAL_LEN){
				//前补0, 如: "110011" to "00110011"
				int i = 0;
				while(tmpStr.length() + i < ORGINAL_LEN){
					i ++;
					sb.append("0");
				}
				sb.append(tmpStr);
			}else{
				sb.append(tmpStr);
			}
		}
		return sb.toString();
	}
	
	
	// 用SUN自带的进行BASE 64编码
	public static String getBASE64(String s) {
		if (s == null)
			return null;
		return (new sun.misc.BASE64Encoder()).encode(s.getBytes());
	}

	// 将 BASE64 编码的字符串 s 进行解码
	public static String getFromBASE64(String s) {
		if (s == null)
			return null;
		BASE64Decoder decoder = new BASE64Decoder();
		try {
			byte[] b = decoder.decodeBuffer(s);
			return new String(b);
		} catch (Exception e) {
			return null;
		}
	}
}

字符集编码采用默认语言环境的编码方式
最下面的2个方法是sun自带的编码解码方法。
此文转自  [url]http://honda418.iteye.com/blog/392006 [/url]
分享到:
评论

相关推荐

    HexString和Base64String的相互转换

    2. **Base64String转HexString**:这个过程首先对Base64字符串进行解码,还原成原始的二进制数据,然后再将这些二进制数据每字节拆分成两个十六进制字符,从而得到HexString。 在提供的`DataConvert.sln`和`...

    android用base64实现文件与string相互转换

    public void base64StringToFile(String base64String, String outputFile) throws IOException { byte[] decodedBytes = Base64.getDecoder().decode(base64String); Files.write(Paths.get(outputFile), ...

    Base64转String字符串小工具

    Base64转String字符串,支持将Base64转化为String字符串

    Java Base64支持encodeBase64String和decodeBase64String的包

    Base64工具类包,一般用于使用AES加密解密类中的使用工具类中需要引用的jar包

    base64包,decodeBase64包,encodeBase64String包

    2. **Base64解码**: `decodeBase64()`方法则是用于将Base64字符串解码回原始的字节数组。当你从HTTP响应或者JSON数据中接收到一个Base64编码的字符串时,你可以用此方法恢复其原始的二进制格式。这对于接收和处理像...

    javascript/微信小程序中将String进行Base64编码并UTF-8格式输出

    提供一种Base64编码,并输出UTF-8格式的BASE64编码方式。本程序在微信小程序开发工具中已经测试通过。 Base64代码: [javascript] view plain copy print? (function(){ var BASE64_MAPPING = [ 'A','B','C','D',...

    c#中 base64字符串与普通字符串互转

    总结,C#中的Base64字符串与普通字符串互转是通过`System.Convert`类提供的`ToBase64String`和`FromBase64String`方法实现的。在进行转换时,需要确保对字符串的编码有准确的理解,以便正确地转换和还原。在实际应用...

    Base64转换String工具

    可实现Base64数据与String类型数据互转,Base64转string时产生的是HEX格式,转成ascll码即可。

    WPF Image Base64String 互转 Demo

    3. 将byte数组转换为Base64String:最后,我们使用Convert类的ToBase64String方法将byte数组转化为Base64String。 ```csharp string base64String = Convert.ToBase64String(imageBytes); ``` 逆向操作,将Base64...

    Delphi版的Base64互相转换函数

    2. **Base64解码**: - 使用`TNetEncoding.Base64.DecodeStringToBytes`方法,将Base64字符串解码回字节数组。 ```delphi uses System.NetEncoding; var Base64String: string; Bytes: TBytes; begin // ...

    Base64ToHexString.exe

    base64转hexstring工具,可以自由输入base64字符,通过点击转换按钮,对数据进行解析,适合日志里打印的base64字符串,转换为byte字节

    BASE64图片解码_解码_vba图片base64_base64_VBa_图片_

    Function Base64Decode(base64String As String) As Byte() ' 创建XMLDOM对象 Dim xml As Object Set xml = CreateObject("MSXML2.DOMDocument") ' 创建DataObject对象 Dim data As Object Set data = ...

    base64转码解密成明文加密成Java密文

    byte[] decodedBytes = Base64.getDecoder().decode(base64String); String plainText = new String(decodedBytes); // 将解码后的字节转换回字符串 System.out.println("明文: " + plainText); } } ``` 接下来...

    Base64引入包

    String encodedString = new String(Base64.encodeBase64(bytesToEncode)); System.out.println(encodedString); } } ``` 在进行Base64加密时,需要注意的是,Base64编码会增加原始数据的大小,大约是原数据的1/...

    Android图片的Base64编码与解码及解码Base64图片方法

    String strbm = Base64.encodeToString(bytes, Base64.DEFAULT); } ``` 在这个例子中,`Bitmap`对象首先被压缩为`byte`数组,然后使用`Base64.encodeToString()`方法将字节数组编码为Base64字符串。 ### 二、Base...

    Delphi Base64 演示及躲坑

    Base64String := StringReplace(Base64String, '', #13#10 + '', [rfReplaceAll]); ``` 另一个需要注意的是,不同的Base64实现可能会对末尾的填充字符有不同的处理。标准的Base64编码会在数据不足一整组(即3个字节...

    Base64转二进制文件,Base64 To File

    例如,`Convert.FromBase64String()`用于Base64字符串到字节数组的转换,而`Convert.ToBase64String()`则用于字节数组到Base64字符串的转换。 综上所述,Base64转二进制文件的过程在信息技术领域具有重要的实用价值...

    Base64与byte[]相互转换

    String base64 = Base64.getEncoder().encodeToString("测试字符串".getBytes("UTF-8")); System.out.println(base64); ``` 2. **将Base64转换为byte[]** - 使用`BASE64Decoder`实例进行解码: ```java BASE...

    VC++6.0使用base64编解码转图片

    在这个项目中,开发者可能使用了标准库中的`std::stringstream`和`std::vector`来处理数据,以及自定义的查找表来进行Base64字符与6位组之间的转换。同时,他们可能利用了Windows API或者其他图像处理库如GDI+来处理...

Global site tag (gtag.js) - Google Analytics