如何将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

如何使用 expo(文件系统)将视频转换为 base64

如何将base64图像转换为图像并将其保存到文件系统[重复]

如何将音频文件转为base64 编码