如何将base64的文本文件转换为xml文件(或任何其他类型的文件)
Posted
技术标签:
【中文标题】如何将base64的文本文件转换为xml文件(或任何其他类型的文件)【英文标题】:how to convert text file of base64 into xml file(or any other type of file) 【发布时间】:2014-08-21 04:41:13 【问题描述】:我在文本文件中有这些 Base64:
77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxSb290Pg0KICA8SXRl
bXM+DQogICAgPEl0ZW0gTmFtZT0iQ2xhaW1OdW1iZXIiIFZhbHVlPSI0ODY1MTQ4MDQiIC8+DQog
ICAgPEl0ZW0gTmFtZT0iRG9jVHlwZSIgVmFsdWU9IkxpdGlnYXRpb24iIC8+DQogICAgPEl0ZW0g
TmFtZT0iRG9jU3ViVHlwZSIgVmFsdWU9IklOVCBBbnN3ZXJzIiAvPg0KICAgIDxJdGVtIE5hbWU9
IkRvY0RhdGVzIiBWYWx1ZT0iNi8xNC8yMDExIDEyOjAwOjAwIEFNIiAvPg0KICAgIDxJdGVtIE5h
bWU9IkNvbW1lbnRzIiBWYWx1ZT0iUGx0ZiBhbnN3ZXJzIHRvIGludHMgYW5kIHN1bW1hcnkgYnkg
ZGVmZW5zZSBjb3Vuc2VsIiAvPg0KICAgIDxJdGVtIE5hbWU9IlNlY3VyaXR5R3JvdXAiIFZhbHVl
PSJTcGVjIEdlbiIgLz4NCiAgICA8SXRlbSBOYW1lPSJDbGFpbU9mZmljZSIgVmFsdWU9IkFsdCBN
a3RzIE5KIiAvPg0KICAgIDxJdGVtIE5hbWU9IkNsYWltYW50TmFtZSIgVmFsdWU9IkpvYW4gS2Vs
bGV5IiAvPg0KICAgIDxJdGVtIE5hbWU9Ikluc3VyZWROYW1lIiBWYWx1ZT0iQm96dXR0byAmYW1w
OyBBc3NvY2lhdGVzIiAvPg0KICAgIDxJdGVtIE5hbWU9IlByaXZpbGVnZWQiIFZhbHVlPSJObyIg
Lz4NCiAgICA8SXRlbSBOYW1lPSJEaXNwb3NpdGlvbiIgVmFsdWU9IlNlbnQgdG8gRmlsZSIgLz4N
CiAgICA8SXRlbSBOYW1lPSJGZWF0dXJlIiBWYWx1ZT0iIiAvPg0KICAgIDxJdGVtIE5hbWU9IlNl
bnRUbyIgVmFsdWU9IiIgLz4NCiAgICA8SXRlbSBOYW1lPSJGbGFnIiBWYWx1ZT0iMCIgLz4NCiAg
ICA8SXRlbSBOYW1lPSJSZXRhaW5JbWFnZSIgVmFsdWU9Ik5vIiAvPg0KICAgIDxJdGVtIE5hbWU9
IlJldGFpbk9yaWdpbmFsIiBWYWx1ZT0iRG8gTm90IFJldGFpbiIgLz4NCiAgICA8SXRlbSBOYW1l
PSJTb3VyY2UiIFZhbHVlPSJJTkRFWEVEIiAvPg0KICA8L0l0ZW1zPg0KICA8Um91dGU+DQogICAg
PHRvIC8+DQogICAgPGNjIC8+DQogICAgPE5vdGUgLz4NCiAgPC9Sb3V0ZT4NCjwvUm9vdD4=
我需要能够从文本文件中取出那些以 64 为基数的字符并输出一个新的 XML 文件。目前,InputStream 未正确转换为 base 64
public static void main(String[] args)
try
File file = new File("C:\\Users\\khurt\\Desktop\\xml.txt");
InputStream myScan = new FileInputStream(file);
byte[] b = new byte[(int)file.length()];
myScan.read(b);
String cowo = myScan.toString();
String decoded = DatatypeConverter.printBase64Binary(b);
String cat = b.toString();
System.out.println(decoded);
byte[] bArray = cat.getBytes();
OutputStream out = new FileOutputStream("C:\\Users\\gdfurt\\Desktop\\cow.xml");
out.write(b);
out.close();
catch (FileNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
我使用了 System.out.println(decode);检查字符是否与文件中的字符匹配,而它们不匹配。我不知道为什么,我尝试过使用扫描仪,但效果更差。
【问题讨论】:
文本文件中的那些“字节”在我看来很像 base64... 它是base64...有人告诉我这是一回事。我假设它们是不同的? java是否有base64的任何特定变量? Base64 是一种以 ASCII 文本表示二进制数据的方式。但是实际文件的字节会非常不同(特别是,每个 character 文本可能会有一个字节)。老实说,目前还不完全清楚你想要做什么。 您需要先对 Base64 进行解码,然后才能将其解析为 XML。您同事的程序可能已经这样做了,但您还没有内置该功能。Re:“Java 是否有任何特定的 base64 变量?”,IIRC 有一个处理 Base64 的 Apache Commons 包。 我有 base64 字符的文本文件,我需要将文本文件输出为正确的 XML 文件。对困惑感到抱歉。如果我将文本文件转换为字节然后解码字节我会收到正确的字符吗? 【参考方案1】:你得到的数据是 Base64 编码的。而且您没有在代码中对其进行解码。这是其他程序无法将其读取为 XML 文件的主要原因。
另一个隐藏在您的数据字节中。 Start of Byte data is 77u/ 这表示数据是 BINARY 数据,在这里会出现问题。
使用链接体验解码数据:
http://www.opinionatedgeek.com/dotnet/tools/base64decode/
如果您在数据开始时使用 77u/,您将体验到数据是 BINARY 并且将作为文件下载。如果你不使用 77u/ 它只会在线显示输出。
在处理数据时删除前 4 个字符,然后你就可以只进入 java 代码了。
编辑
请使用以下代码 sn-p。您正在重新编码字节数组。你需要解码它。此外,此过程需要将字符串转换为字节,反之亦然。
try
File file = new File("C:\\Users\\ABC\\Desktop\\xml.txt");
InputStream myScan = new FileInputStream(file);
byte[] b = new byte[(int)file.length()];
myScan.read(b);
String cowo = new String(b);
System.out.println( cowo );
String decoded = new String(DatatypeConverter.parseBase64Binary(cowo));
String cat = b.toString();
System.out.println(decoded);
byte[] bArray = cat.getBytes();
OutputStream out = new FileOutputStream("C:\\Users\\ABC\\Desktop\\cow.xml");
out.write(decoded.getBytes());
out.close();
catch (FileNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
【讨论】:
这只是我正在编写的一小部分代码,我需要能够下载各种文件,现在问题只是在 base 64 转换中,我使用了 DatatypeConverter 和它确实将我的数组转换为base64,但它与文件不匹配 谢谢,我在解析文件字节而不是获取字符串然后解析时发现了我的错误【参考方案2】:读取字节:
byte[] b;
try (InputStream in = new FileInputStream(file))
b = new byte[(int) file.length()];
in.read(b);
// Closes in
在 Java 7 中哪个更容易:
b = Files.readAllBytes(file.toPath());
或立即使用 Path i.o.文件:
Path path = Paths.get("C:\\Users\\khurt\\Desktop\\xml.txt");
b = Files.readAllBytes(path);
由于 Base64 只使用 ASCII 做:
String encoded = new String(b, StandardCharsets.US_ASCII);
将 Base64 文本解析为字节[]
b = DatatypeConverter.parseBase64Binary(encoded);
如果您希望 XML 作为文本:
String decoded = new String(b, StandardCharsets.UTF_8);
顺便说一句,XML 以"\ufeff"
Unicode BOM 字符开头,这是多余的。
附录 2021-11-16
现在在 java SE 中有一个 Base64
类:
b = Base64.getDecoder().decode(b);
甚至(适合大文件):
b = Base64.getDecoder().decode(Files.newInputStream(path));
【讨论】:
以上是关于如何将base64的文本文件转换为xml文件(或任何其他类型的文件)的主要内容,如果未能解决你的问题,请参考以下文章
Javascript如何将Base 64 url转换为文件?
如何将 Base64 字符串转换为 javascript 文件对象,如文件输入表单?
有没有办法在不将完整文件加载到内存的情况下将 tiff 图像转换为 Base64