如何解决将十六进制字符串转换为二进制文件使其损坏且无法打开
转换十六进制值时,PDF文件,文件损坏。
这是我要转换的简单 pdf 文件的部分十六进制内容:
0x255044462D312E370D0A25B5B5B5B50D0A312030206F626A0D0A3C3C2F547970652F436174
这个问题是 this 问题的延续,我说我必须在两个以不同方式处理文件的程序之间进行数据迁移。 源程序将十六进制编码的文件存储在数据库中。
我可以使用以下代码成功提取文本文件并将其转换为二进制文件:
file_put_contents(
'document.pdf',hex2bin(str_replace('0x','',$hexPdfString))
);
但是当我在 pdf 文件或其他二进制文件上运行此函数时,它已损坏。
我的问题与 this one 几乎相同,但遗憾的是那里的讨论已停止。
解决方法
十六进制解码您的字符串的结果已损坏因为您的字符串不完整,它只包含前 65535 个字符。十六进制解码后,可以看到 PDF 在元数据流中被截断:
20 0 obj
<</Type/Metadata/Subtype/XML/Length 3064>>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1-701">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
<pdf:Producer>Microsoft® Word 2019</pdf:Producer></rdf:Description>
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:creator><rdf:Seq><rdf:li>Samuel Gfeller</rdf:li></rdf:Seq></dc:creator></rdf:Description>
<rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
<xmp:CreatorTool>Microsoft® Word 2019</xmp:CreatorTool><xmp:CreateDate>2021-06-17T13:00:19+02:00</xmp:CreateDate><xmp:ModifyDate>2021-06-17T13:00:19+02:00</xmp:ModifyDate></rdf:Description>
<rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
<xmpMM:DocumentID>uuid:C29344F5-3E78-414A-B4E3-775A853B1A0C</xmpMM:DocumentID><xmpMM:InstanceID>uuid:C29344F5-3E78-414A-B4E3-775A853B1A0C</xmpMM:InstanceID></rdf:Description>
长度65535当然是特殊的,它是0xFFFF。显然,您在检索该字符串时使用的某些机制无法处理长度超过 65535 个字符的字符串。因此,您必须调查该字符串的来源。
考虑到 the question 您认为这个问题是一个延续,我假设您从中检索数据的 MS SQL 数据库中的字段限制为 65535 字节,或者您的数据库值检索代码将其减少。
在前一种情况下,您无能为力,数据库内容将不完整。在后一种情况下,您只需启用数据库访问代码来处理长字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。