Python 从xml 文件中读取base 64 字符串到类似于QT 的字节数组
Python Read base 64 string from xml file to byte array similar to QT
我正在从 xml 文件中读取 base64 字符串。写入xml文件的base64字符串是QTc++程序生成的。我有 Qtc++ 程序,它解析 xml 文件并能够从 base64 string.I 生成数据,想对 python 做同样的事情 我无法弄清楚如何将 base64 读取为字节类似QTc++的数组。
我的 Qt c++ 代码解析 xml 并解码数据文件,如下所示。为简单起见,我只包括一部分编码的 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++ 程序一样执行相同的操作并获得相同的输出。我试了很多方法都没用。
base64.b64decode
将采用您的 base64 字符串和 return 字节。那些字节只是一堆没有意义的位。您需要告诉 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
.
我正在从 xml 文件中读取 base64 字符串。写入xml文件的base64字符串是QTc++程序生成的。我有 Qtc++ 程序,它解析 xml 文件并能够从 base64 string.I 生成数据,想对 python 做同样的事情 我无法弄清楚如何将 base64 读取为字节类似QTc++的数组。 我的 Qt c++ 代码解析 xml 并解码数据文件,如下所示。为简单起见,我只包括一部分编码的 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++ 程序一样执行相同的操作并获得相同的输出。我试了很多方法都没用。
base64.b64decode
将采用您的 base64 字符串和 return 字节。那些字节只是一堆没有意义的位。您需要告诉 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
.