Python 将二进制数据解码回文件

Python Decoding binary data back to file

我在 MSSQL 中有一个包含压缩和转换文件的数据库,如下所示:

screenshot of values(every of them is 40k symbols long

我需要将这些文件解码为 pdf、docx 和 png 文件。

我试过通过 base64 来做到这一点,但它没有构建正确的文件。

你有什么想法我可以解码所有这些并构建正确的文件吗?

数据是十六进制编码的,试试:

from base64 import b16decode

# Data 
encoded = '0x48656C6C6F'
decoded = b16decode(encoded[2:])
print(decoded)

输出b'Hello'

由于您学习了将 blob 塞入文本数据库的艰难方法,这可能是数据管理员作为新手可能犯下的最严重的错误,臃肿笨重且缓慢,最好将源文件保留在其快速自然的原生压缩中状态并通过相关的唯一 ID 和文件存储名称在数据库中简单地引用。 吐槽完毕。

它们是 40K 的固定大小块这一事实表明它们被分成几块,因此需要几个奇数块来创建一个完整的 BLOB。

您提供的斑点似乎只是 PNG 图像的一部分,如果我的解释正确的话 =

2164 pixels wide by 835 pixels high = 22.54 x 8.70 inches

然而输出只有 4 个像素高,在那个奇怪的可疑大小 canvas 内,如果它只是一个更长的截断流的第一部分,这可能是正确的。如此窄带的颜色范围无助于确定主题,但右侧似乎有明显的近白色边缘,但顶部或左侧边缘没有?

您的 40K 块转换为具有 PNG 特征的大约 20K 二进制文件,但 PNG 以 89 开头,所以您遇到了问题,因为它的前缀是 0x 00 22 40 DD BF(十进制=574676415 因此对于估计为 5,420,860 字节的扩展 PNG 内存需求)

我们可以丢弃 0x 作为十六进制流的签名并像我上面那样使用余数,但是 Odd 00 22 40 DD BF 的意义是什么(很可能部分包含类型的指示符或最终全长大小和/或指向下一个块的指针)

您需要做的是通过常规方法提取该图像并比较预期的总文件大小,因为转换为 20 KB 二进制文件它只能相当于预期总大小的 0.5%。在这种情况下,您需要确定图像其余部分的存储方式和位置,以便将所有(200 个?)部分连接成一个均匀的 blob,即单个图像。

您需要了解缓慢提取块的方法,缓慢地转换并缓慢地拼接在一起,但使用一些预期文件大小的度量。我们所知道的是您的条目在数据主体之前有 5 个字节,但是 largeblob 的标准是 4,而 mediumblob 应该是 3,请参阅 https://www.educba.com/mysql-blob/ 因此我们不知道为什么它不正常,除了它是那样做的由程序员。我

我建议需要了解数据库结构的一个非常相似的问题是 答案是询问以比你的方式更奇怪的方式放置数据的开发人员。

您的数据似乎是 PNG 格式,前面有 pre-pended 内容。如果您使用 dd 去除前 12 个字节,然后使用 xxd 将十六进制恢复为二进制,您可以恢复 PNG 文件的开头:

dd bs=12 skip=1 if=YOURFILE | xxd -r -p > image.png

然后您可以检查该 PNG 文件并查看其大小以及它被截断的事实:

pngcheck -v image.png 

示例输出

File: image.png (21833 bytes)
  chunk IHDR at offset 0x0000c, length 13
    2164 x 835 image, 24-bit RGB, non-interlaced
  chunk sRGB at offset 0x00025, length 1
    rendering intent = perceptual
  chunk gAMA at offset 0x00032, length 4: 0.45455
  chunk pHYs at offset 0x00042, length 9: 3779x3779 pixels/meter (96 dpi)
  chunk IDAT at offset 0x00057, length 65445:  EOF while reading data
ERRORS DETECTED in image.png