Java-Base64文本输入和输出字符串
我需要将包含base64编码文本的字符串写入文本文件,然后将该字符串从文本文件读回字符串变量 我如何才能做到不因编码问题而丢失数据?仅为A–Z、A–Z、0–9、+和/。所以应该没有编码问题。只要你能正确编码Ascii码。Base64的发明是为了表示数据中的字节 要进行编码和解码,可以使用。Base64编码器:Java-Base64文本输入和输出字符串,java,encoding,base64,Java,Encoding,Base64,我需要将包含base64编码文本的字符串写入文本文件,然后将该字符串从文本文件读回字符串变量 我如何才能做到不因编码问题而丢失数据?仅为A–Z、A–Z、0–9、+和/。所以应该没有编码问题。只要你能正确编码Ascii码。Base64的发明是为了表示数据中的字节 要进行编码和解码,可以使用。Base64编码器: // Sample program to encode a binary file into a Base64 text file. // Author: Christian d'Heur
// Sample program to encode a binary file into a Base64 text file.
// Author: Christian d'Heureuse (www.source-code.biz)
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.IOException;
public class Base64FileEncoder {
public static void main (String args[]) throws IOException {
if (args.length != 2) {
System.out.println ("Command line parameters: inputFileName outputFileName");
System.exit (9);
}
encodeFile (args[0], args[1]);
}
private static void encodeFile (String inputFileName, String outputFileName) throws IOException {
BufferedInputStream in = null;
BufferedWriter out = null;
try {
in = new BufferedInputStream(new FileInputStream(inputFileName));
out = new BufferedWriter(new FileWriter(outputFileName));
encodeStream (in, out);
out.flush();
} finally {
if (in != null) in.close();
if (out != null) out.close();
}
}
private static void encodeStream (InputStream in, BufferedWriter out) throws IOException {
int lineLength = 72;
byte[] buf = new byte[lineLength/4*3];
while (true) {
int len = in.read(buf);
if (len <= 0) break;
out.write (Base64Coder.encode(buf, len));
out.newLine();
}
}
} // end class Base64FileEncoder
测试Base64编码器:
// Test program for the Base64Coder class.
public class TestBase64Coder {
public static void main (String args[]) throws Exception {
System.out.println ("TestBase64Coder started");
test1();
test2();
System.out.println ("TestBase64Coder completed");
}
// Test Base64Coder with constant strings.
private static void test1() {
System.out.println ("test1 started");
check ("Aladdin:open sesame", "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); // example from RFC 2617
check ("", "");
check ("1", "MQ==");
check ("22", "MjI=");
check ("333", "MzMz");
check ("4444", "NDQ0NA==");
check ("55555", "NTU1NTU=");
check ("abc:def", "YWJjOmRlZg==");
System.out.println ("test1 completed");
}
private static void check (String plainText, String base64Text) {
String s1 = Base64Coder.encodeString(plainText);
String s2 = Base64Coder.decodeString(base64Text);
if (!s1.equals(base64Text) || !s2.equals(plainText))
System.out.println ("check failed for \""+plainText+"\" / \""+base64Text+"\".");
}
// Test Base64Coder against sun.misc.BASE64Encoder/Decoder with
// random strings.
private static void test2() throws Exception {
System.out.println ("test2 started");
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();
java.util.Random rnd = new java.util.Random(0x538afb92);
for (int i = 0; i < 50000; i++) {
int len = rnd.nextInt(55);
byte[] b0 = new byte[len];
rnd.nextBytes(b0);
String e1 = new String(Base64Coder.encode(b0));
String e2 = enc.encode(b0);
if (!e1.equals(e2))
System.out.println ("Error\ne1=" + e1 + " len=" + e1.length() + "\ne2=" + e2 + " len=" + e2.length());
byte[] b1 = Base64Coder.decode(e1);
byte[] b2 = dec.decodeBuffer(e2);
if (!compareByteArrays(b1, b0) || !compareByteArrays(b2, b0))
System.out.println ("Decoded data not equal. len1=" + b1.length + " len2=" + b2.length);
}
System.out.println ("test2 completed");
}
// Compares two byte arrays.
private static boolean compareByteArrays (byte[] a1, byte[] a2) {
if (a1.length != a2.length) return false;
for (int p = 0; p < a1.length; p++)
if (a1[p] != a2[p]) return false;
return true;
}
} // end class TestBase64Coder
//Base64Coder类的测试程序。
公共类TestBase64编码器{
公共静态void main(字符串args[])引发异常{
System.out.println(“TestBase64编码器已启动”);
test1();
test2();
System.out.println(“TestBase64编码器完成”);
}
//使用常量字符串测试Base64编码器。
私有静态void test1(){
System.out.println(“test1已启动”);
选中(“阿拉丁:芝麻开门”,“QWxhZGRpbjpvcGVuIHNlc2FtZQ=”;//来自RFC 2617的示例
勾选(“,”);
勾选(“1”,“MQ=”);
勾选(“22”,“MjI=”);
支票(“333”,“MzMz”);
检查(“4444”,“NDQ0NA=”);
检查(“55555”、“NTU1NTU=”);
检查(“abc:def”、“YWJjOmRlZg=”);
System.out.println(“完成测试1”);
}
专用静态无效检查(字符串纯文本、字符串base64Text){
字符串s1=Base64Coder.encodeString(纯文本);
字符串s2=Base64Coder.decodeString(base64Text);
如果(!s1.equals(base64Text)| |!s2.equals(明文))
System.out.println(“检查\”“+纯文本+“\”/\”“+base64Text+“\””)失败;
}
//根据sun.misc.Base64编码器/解码器测试Base64编码器
//随机字符串。
私有静态void test2()引发异常{
System.out.println(“test2已启动”);
sun.misc.BASE64Encoder enc=新的sun.misc.BASE64Encoder();
sun.misc.BASE64Decoder dec=新的sun.misc.BASE64Decoder();
java.util.Random rnd=新的java.util.Random(0x538afb92);
对于(int i=0;i<50000;i++){
int len=rnd.nextInt(55);
字节[]b0=新字节[len];
下个字节(b0);
字符串e1=新字符串(Base64Coder.encode(b0));
字符串e2=enc.encode(b0);
如果(!e1.等于(e2))
System.out.println(“Error\ne1=“+e1+”len=“+e1.length()+”\ne2=“+e2+”len=“+e2.length());
字节[]b1=base64编码解码(e1);
字节[]b2=dec.decodeBuffer(e2);
如果(!compareByteArrays(b1,b0)| |!compareByteArrays(b2,b0))
System.out.println(“解码数据不等于.len1=“+b1.length+”len2=“+b2.length”);
}
System.out.println(“完成测试2”);
}
//比较两个字节数组。
专用静态布尔比较器字节数组(字节[]a1,字节[]a2){
如果(a1.length!=a2.length)返回false;
对于(int p=0;p
有一个sun类可以为您执行此操作(尽管它会生成编译器警告:
import sun.misc.BASE64Encoder;
BASE64Encoder encoder = new BASE64Encoder();
String toEncode = "encodeMe";
String encoded = encodeBuffer(toEncode.getBytes());
从内存来看,还有一个Base64解码器,但我没有使用它,我只使用一种方式通过线路比较用户名。这里有一个简单的代码,可以进行编码和解码: 编码步骤
//编码字节
字节[]b64ENC=Base64.encode(“Hello World.getBytes”(“UTF-8”);
String ENCStr=gethextstring(b64ENC,b64ENC.length);
T1.setText(ENCStr);/--用于输出
//解码字节
字节[]decbaray=hexStringToByteArray(ENCStr);
字节[]b64DEC=Base64.解码(decbaray);
//通过将解码字节数组转换为字符串来显示该数组
试一试{
字符串ResDec=新字符串(b64DEC,“UTF-8”);
T2.setText(ResDec);//显示Hello World:)
}捕获(不支持的编码异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//以下是我在上面使用的函数!
公共字符串getHexString(字节[]b,整数长度){
//TODO自动生成的方法存根
字符串结果=”;
for(int i=0;i>>4)和0x0F));
追加(toHexChar(数据&0x0F));
返回buf.toString();
}
公共静态字符到hexchar(int i){
如果((0让我们再次开始关于可移植性的讨论。Javac:A.java:1:警告:sun.misc.BASE64Encoder是sun专有的API,可能会在未来的版本中删除。还有com.sun.org.apache.xerces.internal.impl.dv.util.Base64,它不会生成警告。公平地说,当我只有内部API时,很容易忘记可移植性客户和我的软件系列的一个平台。
import sun.misc.BASE64Encoder;
BASE64Encoder encoder = new BASE64Encoder();
String toEncode = "encodeMe";
String encoded = encodeBuffer(toEncode.getBytes());
// Encoding Bytes
byte[] b64ENC = Base64.encode("Hello World".getBytes("UTF-8"));
String ENCStr = getHexString(b64ENC,b64ENC.length);
T1.setText(ENCStr); //-- for output
// Decoding Bytes
byte[] DECBarray = hexStringToByteArray(ENCStr);
byte[] b64DEC = Base64.decode(DECBarray);
// Displaying Decoded Byte Array by Converting it To String
try {
String ResDec = new String(b64DEC,"UTF-8");
T2.setText(ResDec); //This Displays Hello World :)
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Following are the functions that I used above !
public String getHexString(byte[] b, int length) {
// TODO Auto-generated method stub
String result = "";
for (int i = 0; i < length; i++) {
result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring(1);
}
return result;
}
public static String bytesToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
buf.append(byteToHex(data[i]));
buf.append(" ");
}
return (buf.toString());
}
public static String byteToHex(byte data) {
StringBuffer buf = new StringBuffer();
buf.append(toHexChar((data >>> 4) & 0x0F));
buf.append(toHexChar(data & 0x0F));
return buf.toString();
}
public static char toHexChar(int i) {
if ((0 <= i) && (i <= 9)) {
return (char) ('0' + i);
} else {
return (char) ('a' + (i - 10));
}
}
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}