簡體   English   中英

Python 將二進制數據解碼回文件

[英]Python Decoding binary data back to file

我在 MSSQL 中有一個包含壓縮和轉換文件的數據庫,如下所示:

值的屏幕截圖(每個都是 40k 符號長

我需要將這些文件解碼為 pdf、docx 和 png 文件。

我試圖通過 base64 來做到這一點,但它沒有構建正確的文件。

你有什么想法我怎么能解碼所有這些並構建正確的文件?

您的數據似乎是一個 PNG,前面有一些東西。 如果用dd去除前 12 個字節,然后用xxd將十六進制恢復為二進制,則可以恢復 PNG 文件的開頭:

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

然后,您可以檢查該 PNG 文件並查看它的大小以及它被截斷的事實,如下所示:

pngcheck -v image.png 

樣品 Output

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

數據是十六進制編碼的,試試:

from base64 import b16decode

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

輸出b'Hello'

當您學習將 blob 填充到文本數據庫中的艱難方法時,可能是數據管理員作為新手可能犯下的最嚴重的罪過,臃腫笨拙且速度緩慢,最好將源文件留在其快速自然的本機壓縮 state 中並簡單地在DB 通過相關的唯一 ID 和文件存儲名稱。 吐槽一下。

它們是 40K 的固定大小塊這一事實表明它們被分塊,因此需要幾個奇數塊來創建一個完整的 BLOB。

如果我解釋正確,您呈現的 blob 似乎只是 PNG 圖像的一部分 =

2164 pixels wide by 835 pixels high

然而,output 在奇怪的可疑尺寸 canvas 內只有 5 個像素高,如果它只是截斷更長的 ZF7B44CFAFD5C52223D5498196C8A2E 的第一部分,這可能是正確的

您的 40K 塊轉換為具有 PNG 特征的 22K 二進制文件,但 PNG 以 89 開頭,因此您遇到了問題,因為它的前綴為 0x 00 22 40 DD BF

我們可以丟棄 0x 作為 Hex stream 的簽名,並像我上面所做的那樣使用余數,但是 ODD 00 22 40 DD BF 的意義是什么(很可能部分包含最終全長大小或指針的指示符到下一個塊)

您需要做的是通過常規方法提取該圖像並比較預期的總文件大小,因為轉換為 22Kb 二進制文件可能僅相當於預期總數的一小部分。 在這種情況下,您需要確定圖像的 rest 的存儲方式和位置,以便將所有部分連接成一個同質 blob,即單個圖像。

您需要了解塊被緩慢提取並緩慢轉換並緩慢拼接在一起的方法,但使用一些預期文件大小的度量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM