我正在从xml文件中读取base64字符串。写入xml文件的base64字符串是从QTc ++程序生成的。我有Qtc ++程序解析xml文件并能够从base64 string生成数据。我想用python做同样的事情我无法想象如何将base64读作类似于QTc ++的字节数组。 我解析xml并解码数据文件的Qt c ++代码如下所示。为简单起见,我只包括编码的base64字符串的一部分。
datastring='AAAAAAAAAAA/YGJN0vGp/D9wYk3S8an8P3iTdLxqfvo/'
QByteArray xByteArray =QByteArray::fromBase64('datastring')
QDataStream xInStream(xByteArray);
while (!xInStream.atEnd())
{
double d;
xInStream >> d;
qDebug()<<d;
pPlotCurve->addXAxisValue(d);
}
我能够使用QTc ++解码数据,输出看起来像[0.0,0.002 0.004,......]
我正在尝试在python中解码相同的base64字符串,我收到了乱码数据。我的Python代码是
import base64
# I parse the xml file and retrieve the data below
datastring = 'AAAAAAAAAAA/YGJN0vGp/D9wYk3S8an8P3iTdLxqfvo/'
out = base64.b64decode(datastring)
print out
当我对上面的代码进行解码时,我得到了加扰数据,如何执行与上述QTc ++程序相同的操作并获得相同的输出。我尝试了很多方法但没有任何效果。
答案 0 :(得分:1)
base64.b64decode
将获取你的base64字符串并返回字节。那些字节只是一堆没有意义的位。您需要告诉Python如何将这些位转换为有意义的数据。
使用struct
模块告诉Python如何解释二进制数据:
import base64
import struct
data_base64 = 'AAAAAAAAAAA/YGJN0vGp/D9wYk3S8an8P3iTdLxqfvo/'
data_bytes = base64.b64decode(data_base64)
# '>ddddx' big endian, 4 8-byte floating point plus 1 extra byte
struct.unpack('>ddddx', data_bytes)
# gives (0.0, 0.002, 0.004, 0.006)
要解压缩任意数量的双打,请执行以下操作:
[struct.unpack_from('>d', data_bytes, offset)[0] for offset in range(0, len(data_bytes), 8)]
# gives [0.0, 0.002, 0.004, 0.006]
请注意,您的示例数据长度为33个字节。如果你使用第二种方法,请确保你的字节长度是8的倍数,否则你将获得struct.error: unpack_from requires a buffer of at least 8 bytes
。