首页 > 解决方案 > Java中的十六进制转字节

问题描述

我正在研究一个 Word 文件操纵器(具体来说是 DOCX 格式),它工作正常,但在这个阶段,我希望从 SAP 软件中获取一个文件,我以字节的形式获取文件,看起来像504B030414000600080000002100DFA4D26C5A0100002005000013000.

但是我尝试使用此代码来读取接收到的字节,将它们放入输入流中并使用 Apache POI 的函数打开它们:

byte[] byteArr = "504B030414000600080000002100DFA4D26C5A01000020050000130008025B436F6E74656E745F54797065735D2E786D6C20A2040228A0000200000000000000".getBytes();
InputStream fis = new ByteArrayInputStream(byteArr);
return new XWPFDocument(OPCPackage.open(fis));

最后一行给我带来了文件给出的错误不是 OOXML。

如何将收到的字节转换为 Java 中的相关内容?

标签: javaapache-poi

解决方案


使用getBytes的是String类型。因为这是十六进制,所以您必须使用DatatypeConverter.parseHexBinary.

这个问题有更多信息,甚至更多可供选择的选项:
Convert a string representation of a hex dump to a byte array using Java?


现在,话虽如此,我无法将您问题中提供的十六进制字符串转换为一个好的文档。

运行这个函数:

    try (final FileOutputStream fos = new FileOutputStream(new File("C:/", "Test Document.docx")))
    {
        final byte[] b = DatatypeConverter.parseHexBinary(
                "504B030414000600080000002100DFA4D26C5A01000020050000130008025B436F6E74656E745F54797065735D2E786D6C20A2040228A0000200000000000000");
        fos.write(b);
    }

...导致以下文件:

在此处输入图像描述

那里很有希望(如果您使用[Content_Types].xml7-Zip 打开其他有效文档,您将在存档中看到)。但是,我无法使用 MS-Office、LibreOffice 或 7-Zip 打开此文件。

如果我不得不猜测,我会说这个特定的文件已经损坏,或者它的一部分丢失了。


推荐阅读