2012-09-07 65 views
3

如何将下列Base64编码二进制字符串转换为java中的二进制文件。我已经看到人们使用下面的代码在php中做同样的事情。如何在java中实现这一点?如何将Base64编码二进制字符串转换为java中的二进制文件?

在PHP:

$byteArr = "AAAAAEAA"; 
$maparray = array(); 
$map = ""; 
foreach(str_split($byteArr) as $c) 
    $maparray [] = sprintf("%08b", ord($c)); 
$map = implode("", $maparray); 

Output is $map -> "000000000000000000000000000000000100000000000000"; 

但是当我尝试这在java中:

String input = "AAAAAEAA"; 
String mapArray = ""; 
for(int b=0;b<input.length();b++){ 
    int asciValueOfChar =(int)toByte.charAt(b); 
    String binaryInt = Integer.toBinaryString(asciValueOfChar); 
    String paddedBinaryInt = String.format("%8s", binaryInt); 
    paddedBinaryInt = paddedBinaryInt.replace(' ', '0'); 
    System.out.println("ASCII Code::"+asciValueOfChar); 
    System.out.println("Binary of Char::"+binaryInt); 
    System.out.println("Binary of Padded Char::"+binaryInt); 
    mapArray = mapArray + paddedBinaryInt ; 
} 
System.out.println("Binary Array::"+mapArray); 

Output is mapArray -> "0100000101000001010000010100000101000001010001010100000101000001" 

的输出有所不同。

我怎样才能达到相同的输出?

感谢,

回答

0

首先,我不相信PHP给你高于mentio ned字符串(000000000000000000000000000000000100000000000000)作为输出!

您问题中的代码枚举输入字符串中的每个字符(AAAAAEAA),检索每个字符的ASCII value并将其发布在输出中。如果你执行你提到的PHP代码,你将得到与你提到的运行JAVA代码(0100000101000001010000010100000101000001010001010100000101000001)完全相同的输出。

例如,

ord("A") = 65 

65又具有01000001二进制表示。

其次,更正您的问题以获得正确答案。看来,大家早些时候回答说,根本不理解你的问题。第三,如果你想获得给定字符串的二进制表示,可以使用getBytes()方法检索整个字符串的字节表示。使用或修改this code snippet以获取给定字节数组的二进制表示形式。

1

要解码的base64,最简单的就是使用Apache commons Decoder

import org.apache.commons.codec.binary.Base64; 

byte[] decodedBytes = Base64.decodeBase64(input); 

你真的需要二进制作为由“0”和“1”字符组成的字符串吗?

+0

如果您想限制依赖关系,也可以使用javax.xml.DatatypeConverter。 – Andrei0427

0

我希望人们推荐Apache的百科全书,但我不知道它是否携带或不...

您可以使用此一:

public class Base64Coder 
{ 

// Mapping table from 6-bit nibbles to Base64 characters. 
private static final char[] map1    = new char[64]; 
static 
{ 
    int i = 0; 
    for (char c = 'A'; c <= 'Z'; c++) 
     map1[i++] = c; 
    for (char c = 'a'; c <= 'z'; c++) 
     map1[i++] = c; 
    for (char c = '0'; c <= '9'; c++) 
     map1[i++] = c; 
    map1[i++] = '+'; 
    map1[i++] = '/'; 
} 
// Mapping table from Base64 characters to 6-bit nibbles. 
private static final byte[] map2    = new byte[128]; 
static 
{ 
    for (int i = 0; i < map2.length; i++) 
     map2[i] = -1; 
    for (int i = 0; i < 64; i++) 
     map2[map1[i]] = (byte) i; 
} 
// The line separator string of the operating system. 
private static final String systemLineSeparator = System.getProperty("line.separator"); 


/** 
* Decodes a byte array from Base64 format. No blanks or line breaks are 
* allowed within the Base64 encoded input data. 
* 
* @param in 
*   A character array containing the Base64 encoded data. 
* @return An array containing the decoded data bytes. 
* @throws IllegalArgumentException 
*    If the input is not valid Base64 encoded data. 
*/ 
public static byte[] decode(char[] in) 
{ 
    return decode(in, 0, in.length); 
} 

/** 
* Decodes a byte array from Base64 format. No blanks or line breaks are 
* allowed within the Base64 encoded input data. 
* 
* @param in 
*   A character array containing the Base64 encoded data. 
* @param iOff 
*   Offset of the first character in <code>in</code> to be 
*   processed. 
* @param iLen 
*   Number of characters to process in <code>in</code>, starting 
*   at <code>iOff</code>. 
* @return An array containing the decoded data bytes. 
* @throws IllegalArgumentException 
*    If the input is not valid Base64 encoded data. 
*/ 
public static byte[] decode(char[] in, int iOff, int iLen) 
{ 
    if (iLen % 4 != 0) throw new IllegalArgumentException("Length of Base64 encoded input string is not a multiple of 4."); 
    while (iLen > 0 && in[iOff + iLen - 1] == '=') 
     iLen--; 
    int oLen = (iLen * 3)/4; 
    byte[] out = new byte[oLen]; 
    int ip = iOff; 
    int iEnd = iOff + iLen; 
    int op = 0; 
    while (ip < iEnd) 
    { 
     int i0 = in[ip++]; 
     int i1 = in[ip++]; 
     int i2 = ip < iEnd ? in[ip++] : 'A'; 
     int i3 = ip < iEnd ? in[ip++] : 'A'; 
     if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127) 
      throw new IllegalArgumentException("Illegal character in Base64 encoded data."); 
     int b0 = map2[i0]; 
     int b1 = map2[i1]; 
     int b2 = map2[i2]; 
     int b3 = map2[i3]; 
     if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0) throw new IllegalArgumentException("Illegal character in Base64 encoded data."); 
     int o0 = (b0 << 2) | (b1 >>> 4); 
     int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2); 
     int o2 = ((b2 & 3) << 6) | b3; 
     out[op++] = (byte) o0; 
     if (op < oLen) out[op++] = (byte) o1; 
     if (op < oLen) out[op++] = (byte) o2; 
    } 
    return out; 
} 

/** 
* Decodes a byte array from Base64 format. No blanks or line breaks are 
* allowed within the Base64 encoded input data. 
* 
* @param s 
*   A Base64 String to be decoded. 
* @return An array containing the decoded data bytes. 
* @throws IllegalArgumentException 
*    If the input is not valid Base64 encoded data. 
*/ 
public static byte[] decode(String s) 
{ 
    return decode(s.toCharArray()); 
} 

/** 
* Decodes a byte array from Base64 format and ignores line separators, tabs 
* and blanks. CR, LF, Tab and Space characters are ignored in the input 
* data. This method is compatible with 
* <code>sun.misc.BASE64Decoder.decodeBuffer(String)</code>. 
* 
* @param s 
*   A Base64 String to be decoded. 
* @return An array containing the decoded data bytes. 
* @throws IllegalArgumentException 
*    If the input is not valid Base64 encoded data. 
*/ 
public static byte[] decodeLines(String s) 
{ 
    char[] buf = new char[s.length()]; 
    int p = 0; 
    for (int ip = 0; ip < s.length(); ip++) 
    { 
     char c = s.charAt(ip); 
     if (c != ' ' && c != '\r' && c != '\n' && c != '\t') buf[p++] = c; 
    } 
    return decode(buf, 0, p); 
} 

/** 
* Decodes a string from Base64 format. No blanks or line breaks are allowed 
* within the Base64 encoded input data. 
* 
* @param s 
*   A Base64 String to be decoded. 
* @return A String containing the decoded data. 
* @throws IllegalArgumentException 
*    If the input is not valid Base64 encoded data. 
*/ 
public static String decodeString(String s) 
{ 
    return new String(decode(s)); 
} 

/** 
* Encodes a byte array into Base64 format. No blanks or line breaks are 
* inserted in the output. 
* 
* @param in 
*   An array containing the data bytes to be encoded. 
* @return A character array containing the Base64 encoded data. 
*/ 
public static char[] encode(byte[] in) 
{ 
    return encode(in, 0, in.length); 
} 

/** 
* Encodes a byte array into Base64 format. No blanks or line breaks are 
* inserted in the output. 
* 
* @param in 
*   An array containing the data bytes to be encoded. 
* @param iLen 
*   Number of bytes to process in <code>in</code>. 
* @return A character array containing the Base64 encoded data. 
*/ 
public static char[] encode(byte[] in, int iLen) 
{ 
    return encode(in, 0, iLen); 
} 

/** 
* Encodes a byte array into Base64 format. No blanks or line breaks are 
* inserted in the output. 
* 
* @param in 
*   An array containing the data bytes to be encoded. 
* @param iOff 
*   Offset of the first byte in <code>in</code> to be processed. 
* @param iLen 
*   Number of bytes to process in <code>in</code>, starting at 
*   <code>iOff</code>. 
* @return A character array containing the Base64 encoded data. 
*/ 
public static char[] encode(byte[] in, int iOff, int iLen) 
{ 
    int oDataLen = (iLen * 4 + 2)/3;  // output length without padding 
    int oLen = ((iLen + 2)/3) * 4;   // output length including padding 
    char[] out = new char[oLen]; 
    int ip = iOff; 
    int iEnd = iOff + iLen; 
    int op = 0; 
    while (ip < iEnd) 
    { 
     int i0 = in[ip++] & 0xff; 
     int i1 = ip < iEnd ? in[ip++] & 0xff : 0; 
     int i2 = ip < iEnd ? in[ip++] & 0xff : 0; 
     int o0 = i0 >>> 2; 
     int o1 = ((i0 & 3) << 4) | (i1 >>> 4); 
     int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6); 
     int o3 = i2 & 0x3F; 
     out[op++] = map1[o0]; 
     out[op++] = map1[o1]; 
     out[op] = op < oDataLen ? map1[o2] : '='; 
     op++; 
     out[op] = op < oDataLen ? map1[o3] : '='; 
     op++; 
    } 
    return out; 
} 

/** 
* Encodes a byte array into Base 64 format and breaks the output into lines 
* of 76 characters. This method is compatible with 
* <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>. 
* 
* @param in 
*   An array containing the data bytes to be encoded. 
* @return A String containing the Base64 encoded data, broken into lines. 
*/ 
public static String encodeLines(byte[] in) 
{ 
    return encodeLines(in, 0, in.length, 76, systemLineSeparator); 
} 

/** 
* Encodes a byte array into Base 64 format and breaks the output into 
* lines. 
* 
* @param in 
*   An array containing the data bytes to be encoded. 
* @param iOff 
*   Offset of the first byte in <code>in</code> to be processed. 
* @param iLen 
*   Number of bytes to be processed in <code>in</code>, starting 
*   at <code>iOff</code>. 
* @param lineLen 
*   Line length for the output data. Should be a multiple of 4. 
* @param lineSeparator 
*   The line separator to be used to separate the output lines. 
* @return A String containing the Base64 encoded data, broken into lines. 
*/ 
public static String encodeLines(byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) 
{ 
    int blockLen = (lineLen * 3)/4; 
    if (blockLen <= 0) throw new IllegalArgumentException(); 
    int lines = (iLen + blockLen - 1)/blockLen; 
    int bufLen = ((iLen + 2)/3) * 4 + lines * lineSeparator.length(); 
    StringBuilder buf = new StringBuilder(bufLen); 
    int ip = 0; 
    while (ip < iLen) 
    { 
     int l = Math.min(iLen - ip, blockLen); 
     buf.append(encode(in, iOff + ip, l)); 
     buf.append(lineSeparator); 
     ip += l; 
    } 
    return buf.toString(); 
} 

/** 
* Encodes a string into Base64 format. No blanks or line breaks are 
* inserted. 
* 
* @param s 
*   A String to be encoded. 
* @return A String containing the Base64 encoded data. 
*/ 
public static String encodeString(String s) 
{ 
    return new String(encode(s.getBytes())); 
} 

// Dummy constructor. 
private Base64Coder() 
{ 
} 
} 

用法:

String message = "blahblah"; 
byte[] encoded = Base64Coder.encode(message.getBytes("UTF-8")); 
byte[] decoded = Base64Coder.decode(encoded); 
String msg2 = new String(decoded, "UTF-8"); 
if(message.equals(msg2)) System.out.println("yaay"); 

它也与Sun的代码兼容...

0

Android包含自己的Base64编码器和解码器。所有你需要解码一个Base64字符串是这样的:

byte[] decoded = Base64.decode(string, Base64.DEFAULT); 

第二个参数是一个标志。请参阅:Base64

相关问题