将十六进制字符串转换为二进制文件使其损坏且无法打开

Posted

技术标签:

【中文标题】将十六进制字符串转换为二进制文件使其损坏且无法打开【英文标题】:Converting hex string to binary file makes it corrupt and unable to open 【发布时间】:2021-09-02 04:56:04 【问题描述】:

转换十六进制值时,PDF 文件,文件已损坏。 这是我要转换的一个简单 pdf 文件的部分十六进制内容:

0x255044462D312E370D0A25B5B5B5B50D0A312030206F626A0D0A3C3C2F547970652F436174

完整字符串:jsfiddle、pastebin

这个问题是this 问题的延续,我说我必须在两个以不同方式处理文件的程序之间进行数据迁移。 源程序将十六进制编码的文件存储在数据库中。

我可以使用以下代码成功提取文本文件并将其转换为二进制文件:

file_put_contents(
    'document.pdf', 
    hex2bin(str_replace('0x', '', $hexPdfString))
);

但是当我在 pdf 文件或其他二进制文件上运行此函数时,它已损坏。 我的问题与this one 几乎相同,但不幸的是,那里的讨论已停止。

【问题讨论】:

【参考方案1】:

十六进制解码您的字符串的结果已损坏因为您的字符串不完整,它只包含前 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 字节,或者您的数据库值检索代码将其缩减。

在前一种情况下,您无能为力,数据库内容将不完整。在后一种情况下,您只需启用数据库访问代码来处理长字符串。

【讨论】:

以上是关于将十六进制字符串转换为二进制文件使其损坏且无法打开的主要内容,如果未能解决你的问题,请参考以下文章

将文件转换为二进制(11111111110)然后执行反向路径以获取图像

为啥Excel无法打开二进制数据?

文件或目录损坏且无法读取

blob 上的错误内容类型无法打开 img / 文件已损坏

通过 libcurl 以二进制形式传输的文件已损坏

将任何文件转换为二进制字符串并从二进制转换为文件[关闭]