java - Java中的十六进制转字节
问题描述
我正在研究一个 Word 文件操纵器(具体来说是 DOCX 格式),它工作正常,但在这个阶段,我希望从 SAP 软件中获取一个文件,我以字节的形式获取文件,看起来像504B030414000600080000002100DFA4D26C5A0100002005000013000
.
但是我尝试使用此代码来读取接收到的字节,将它们放入输入流中并使用 Apache POI 的函数打开它们:
byte[] byteArr = "504B030414000600080000002100DFA4D26C5A01000020050000130008025B436F6E74656E745F54797065735D2E786D6C20A2040228A0000200000000000000".getBytes();
InputStream fis = new ByteArrayInputStream(byteArr);
return new XWPFDocument(OPCPackage.open(fis));
最后一行给我带来了文件给出的错误不是 OOXML。
如何将收到的字节转换为 Java 中的相关内容?
解决方案
使用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].xml
7-Zip 打开其他有效文档,您将在存档中看到)。但是,我无法使用 MS-Office、LibreOffice 或 7-Zip 打开此文件。
如果我不得不猜测,我会说这个特定的文件已经损坏,或者它的一部分丢失了。
推荐阅读
- types - f# 表达式的类型
- kotlin - 下面代码的 reader.next()[0] 行中 [0] 的作用是什么
- c - 为了让我的 C 程序更加用户友好,需要进行哪些更改?
- c# - 不支持 WCF 服务操作类型
- javascript - Nodejs,如何在同一行显示和更新文本,例如运行时钟或下载速度?
- perl - 我可以用perl中的子类比较来调用超类排序吗?
- qt - 如果在 QWidget 中创建 QQuickWidget,则 Qt qml 崩溃
- html - 如何创建包含 4 个部分的页面布局?
- kubernetes - kubernetes Pod 的 readinessProbe 出错但端点未从服务中删除
- c# - 具有五个数字级别的分层大纲 - 如何插入同级或子行并调整现有记录?