簡體   English   中英

解碼Base64字符串

[英]Decoding Base64 string

我正在使用Python進行一些字符串解碼,並且試圖了解這行代碼的含義...

for irradiance_data in struct.iter_unpack("qHHHHfff", irradiance_list_bytes):
                print(irradiance_data)

在我的情況下,irradiance_list_bytes就是這樣

"\xf5R\x960\x00\x00\x00\x009\x0f\xb4\x03\x01\x00d\x00\xa7D\xd1BC\x8c\x9d\xc2\xb3\xa5\xf0\xc0\xaer\x990\x00\x00\x00\x000\x0f\xb2\x03\x01\x00d\x00\x8f+\xd1B\x81\x9c\x9d\xc2\xf7\xfb\xe6\xc0u\x96\x9c0\x00\x00\x00\x00.\x0f\xb1\x03\x01\x00d\x00\xfe\x81\xd3B\x8a\r\x9e\xc2\xb4\xe7\x01\xc1\x1a\x7f\x9f0\x00\x00\x00\x00*\x0f\xb0\x03\x01\x00d\x00Z\xf5\xd3B\xedq\x9e\xc2&\xa1\x03\xc1\x94\x82\xa20\x00\x00\x00\x00-\x0f\xb1\x03\x01\x00d\x00\xb6\x8f\xd3Bg\xdf\x9d\xc2\x00\xad\xfd\xc0#\x93\xa50\x00\x00\x00\x000\x0f\xb2\x03\x01\x00d\x00\x95n\xd4B\x1d'\x9e\xc2\x1dW\x01\xc1\xd3\xa1\xa80\x00\x00\x00\x001\x0f\xb2\x03\x01\x00d\x00\x1d\xbc\xd3B\xeb\xca\x9d\xc2s\xbf\xf2\xc0.\xaf\xab0\x00\x00\x00\x001\x0f\xb2\x03\x01\x00d\x00\x13\xad\xd4BJx\x9d\xc2G(\xfb\xc0.\xc2\xae0\x00\x00\x00\x007\x0f\xb4\x03\x01\x00d\x00\xd1\xc9\xd4BS\xb8\x9d\xc2\xf0\xd9\xf8\xc0"

消息錯誤是

AttributeError: 'module' object has no attribute 'iter_unpack'

我相信,我必須將“ qHHHHfff”更改為另一種字符串格式,但是我不明白嗎?

完整的代碼在這里...

import os
import glob
import exiftool
import base64
import struct 

irradiance_list_tag = 'XMP:IrradianceList'
irradiance_calibration_measurement_golden_tag = 'XMP:IrradianceCalibrationMeasurementGolden'
irradiance_calibration_measurement_tag = 'XMP:IrradianceCalibrationMeasurement'

tags = [ irradiance_list_tag, irradiance_calibration_measurement_tag ]

directory = '/home/stagiaire/Bureau/AAAA/'

channels = [ 'RED' ]

index = 0

for channel in channels:
    files = glob.glob(os.path.join(directory, '*' + channel + '*'))
    with exiftool.ExifTool() as et:
        metadata = et.get_tags_batch(tags, files)
        for file_metadata in metadata:
            irradiance_list = file_metadata[irradiance_list_tag]
            irradiance_calibration_measurement = file_metadata[irradiance_calibration_measurement_tag]
            irradiance_list_bytes = base64.b64decode(irradiance_list)
            print(files[index])
            index += 1            

            for irradiance_data in struct.iter_unpack("qHHHHfff", irradiance_list_bytes):
                print(irradiance_data)

編輯

因此,斯特魯布布利(Strubbly)表示,這是該問題的解決方案。

print struct.unpack("I",x[:4])

對於范圍(8)中的i:start = 4 + i * 28 print struct.unpack(“ qHHHHfff”,x [start:start + 28])

struct.iter_unpack僅在Python 3中可用,而您正在使用Python2。沒有直接等效項。 struct.unpack將解壓縮一個28字節的塊(帶有該格式字符串)。 struct.iter_unpack將在Python 3中解壓縮28字節的倍數。

如果您的數據適合使用該格式代碼的struct.iter_unpack ,則可以執行以下操作:

for i in range(0,len(x),28):
    print struct.unpack("qHHHHfff",x[i:i+28])

不幸的是,您的示例數據不是28個字節長的倍數,因此我預計Python 3也會出現錯誤。

在不了解數據的情況下,很難糾正代碼,但是,您可能會猜到數據的前面有4個字節的其他數據。 因此,可以使用以下內容解壓縮:

print struct.unpack("I",x[:4])
for i in range(8):
    start = 4 + i*28
    print struct.unpack("qHHHHfff",x[start:start+28])

在此示例中,我猜測前四個字節是unsigned int但是我無法知道這是否正確。 需要更多信息。

暫無
暫無

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

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