【问题标题】:Python Read base 64 string from xml file to byte array similar to QTPython从xml文件读取base 64字符串到类似于QT的字节数组
【发布时间】:2015-11-18 01:07:47
【问题描述】:

我正在从 xml 文件中读取 base64 字符串。写入 xml 文件的 base64 字符串是从 QTc++ 程序生成的。我有解析 xml 文件并能够从 base64 字符串生成数据的 Qtc++ 程序。我想对 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++ 程序一样执行相同的操作并获得相同的输出。我尝试了很多方法,但没有任何效果。

【问题讨论】:

  • 抱歉应该是数据串

标签: python xml qt base64


【解决方案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

【讨论】:

  • 好的,你能告诉我解压时'>ddddx'是什么意思
  • @arun:评论解释了它。链接的文档还提供了更多详细信息。
  • 现在如果我解码我的整个 base64 字符串。我得到这个错误:解包需要长度为 33 的字符串参数
  • 非常感谢它的工作,我现在将研究这个结构包并了解更多信息
猜你喜欢
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2021-08-08
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多