解码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) 中:
开始 = 4 + i*28
打印 struct.unpack("qHHHHfff",x[开始:开始+28])
struct.iter_unpack
仅适用于 Python 3,而您使用的是 Python 2。
没有直接的等价物。 struct.unpack
将解压缩一个 28 字节的块(使用该格式字符串)。 struct.iter_unpack
将在 Python 中解压 28 字节的倍数 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
,但我无法知道这是否正确。需要更多信息。
我正在使用 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) 中: 开始 = 4 + i*28 打印 struct.unpack("qHHHHfff",x[开始:开始+28])
struct.iter_unpack
仅适用于 Python 3,而您使用的是 Python 2。
没有直接的等价物。 struct.unpack
将解压缩一个 28 字节的块(使用该格式字符串)。 struct.iter_unpack
将在 Python 中解压 28 字节的倍数 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
,但我无法知道这是否正确。需要更多信息。