2017-04-19 234 views
0

我與運行的Python做一些字符串解碼,我想了解什麼呢這行代碼...解碼Base64編碼字符串

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) 
+1

你是否偶然使用Python 2?看起來'iter_unpack'是在Python 3中添加的:https://docs.python.org/3/library/struct.html#struct.iter_unpack – bernie

+0

這個錯誤實際上告訴你在函數中沒有函數叫做iter_unpack 'struct'模塊。你使用的是什麼版本的Python?根據文檔(https://docs.python.org/3/library/struct.html#struct.iter_unpack),此功能在3.4中添加。 –

+0

@bernie是的我正在使用Python2,那麼Python 2中的那個函數的等價物是什麼? –

回答

1

struct.iter_unpack只有在Python 3可用,並且您正在使用Python 2 沒有直接等同。 struct.unpack將解壓一個28字節的塊(使用該格式字符串)。 struct.iter_unpack將解包的28個字節的倍數在Python 3

如果你的數據是適合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但我不知道,如果這是正確的方式。需要更多信息。

+0

謝謝vertu mych sur!我只是在Python 2中試過這段代碼... '對於我在範圍內(0,len(x),28): print struct.unpack(「qHHHHfff」,x [i:i + 28]) ' 它的工作! –