这个问题已经在这里有了答案: > Coverting Hex to Image in PHP? 2个
我将二进制图像数据保存在我的旧数据库中,由我的旧开发人员保存,现在我想使用PHP显示图像中的图像,但是我不能.
我尝试过imagecreatefromstring
,但返回FALSE.
二进制示例数据:http://freezinfo.com/gg.php
解决方法:
给定显示为文本的字符串(extactly this sequence),它是十六进制数字的组合.
在Jpeg中,此类文件的幻数是前两个字节为FF D8,后两个字节为FF D9(与How to identify contents of a byte[] is a jpeg?比较).
这些十六进制(简写为十六进制)数字也可以在序列的开头和结尾找到:
FF00D800FF00 ... 1F00FF00D9000
## ## ## ##
查找这些魔术数字还表明,十六进制值始终附加为00.它还显示在最后找到一个额外的单0.
因此,四个字符始终形成一个值.十六进制编码,看起来像16位值,但是该值永远不会超过8位范围(0-255),因此总是可见00.
仅凭此信息,然后就可以尝试将其转换为PHP的imagecreatefromstring可以处理的二进制字符串:
$string = implode('', // map array of binary strings to binary string
array_map('chr', // map ord integer value to character
unpack('v*', // unsigned short (always 16 bit, little endian byte order)
pack("H*", $data) // hex to binary (high nibble first)
)));
然后使用这样的字符串
$result = imagecreatefromstring($string);
imagejpeg($result, 'test.jpg');
imagecreatefromstring(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: bad Huffman code
和下图:
这看起来拼命碎了.因此,您可能在此处面临其他编码问题.最后一个NUL字节表明已完成了更多工作,并且还必须有一个原因,为什么数据已存储为16位十六进制值而不是二进制数据(blob),因为数据库对此有所支持.
但是不要浪费太多时间,因为过去使用的软件和配置存在缺陷,这可能只是数据丢失,因此您所能做的就是从备份中还原.