【问题标题】:Type H: illegal hex digit xH 型:非法十六进制数字 x
【发布时间】:2014-02-25 13:27:59
【问题描述】:

我正在进行从一个应用程序到另一个应用程序的数据转换。 MSSQL 表之一将 PDF 和 DOC 等文档存储为十六进制字符串。我被要求将这些十六进制字符串转换并写入文件。

我在谷歌上搜索并找到了一个建议以下内容的网站:

$hex    = file_get_contents('hex.txt');
file_put_contents('converted.pdf', pack('H*', $hex));

其中 hex.txt 是从表中提取的数据。但是,我收到了错误

PHP 警告:pack(): Type H: 非法十六进制数字 x in ....

以下是提取的十六进制字符串的缩短版本

0xEC5A09584CFBFB3F33A575A64D9B164EB750A.....

所以现在,我想知道是否可以将这些十六进制字符串转换为二进制并将其写入文件。谢谢你,希望有人能帮助我解决这个问题。

【问题讨论】:

    标签: php sql-server


    【解决方案1】:

    0x 只是将字符串表示为十六进制数。剥离它并 pack() 其余部分。

    【讨论】:

    • 谢谢。这阻止了错误的出现。但是,它没有制作有效的 PDF 文件。有人知道如何将十六进制字符串转换为 PDF 或 DOC 文件吗?
    • @asyadiqin:仔细检查文件的字节序和大小;在数据转换中,很容易出现问题。对converted.pdf 的前几个字节进行十六进制转储;它应该以25 50 44 46 开头,顺序为(%PDF)。将converted.pdf 的大小与原始 数据源中的数据大小进行比较。不要信任中间文件;数据可能在导出期间被截断。
    【解决方案2】:

    使用 php 的 pdf 生成库:

    【讨论】:

    • 并不是真正关注 PDF 库,而是更多地关注转换十六进制字符串并写入 PDF 文件。十六进制字符串由名为 Front Desk 的软件生成,该软件将上传的文件转换为十六进制字符串并将其存储为十六进制字符串。所以想知道我可以扭转这个过程并将其写回到一个文件中。谢谢。
    【解决方案3】:

    这个怎么样:

    $hexAsString = file_get_contents( 'hex.txt' );
    
    // Just in case...
    assert( '0x' == substr( $hexAsString, 0, 2 ));
    
    // Skip first two chars
    $hexDigits = substr( $hexAsString, 2, strlen( $hexAsString ) -2 );
    
    file_put_contents( 'converted.pdf', pack('H*', $hexDigits));
    

    【讨论】:

      【解决方案4】:

      我认为您已经在评论中发布了问题的答案:

      十六进制字符串是由名为 Front Desk 的软件生成的,该软件 将上传的文件转换为十六进制字符串并存储为十六进制字符串。

      您最好的选择是找到某种关于 Front Desk 如何转换其文件的文档;或者通过上传一些新的简单测试文件来进行一些试错逆向工程。

      很可能是系统向十六进制字符串添加了某种检查/元数据。或者先进行某种压缩(想想 ZIP)。

      【讨论】:

        猜你喜欢
        • 2022-08-20
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        • 2016-11-12
        • 2017-04-25
        相关资源
        最近更新 更多