QByteArray 转换为十六进制失败
Posted
技术标签:
【中文标题】QByteArray 转换为十六进制失败【英文标题】:QByteArray convert to hex fails 【发布时间】:2017-04-07 20:23:26 【问题描述】:我在 QT 项目中使用 GMP,我正在尝试使用 QByteArray 来存储一些数字。
当我想将字节数组转换为 mpz_t 时,我正在执行以下操作:
const char *hexstring = qbyteval.toHex().toStdString().c_str();
mpz_t myval;
mpz_init (myval);
mpz_set_str(myval, hexstring, 16);
mpz_t zero;
mpz_init(zero);
mpz_set_str(zero, "0", 10);
if(mpz_comp(myval, zero) == 0)
//...set a breakpoint or do something here. This line shouldn't be reached ever.
就我而言,qbyteval
永远不会为零。如果我在该 mpz_comp if 块内设置断点,则 qbyteval.toHex() 始终仍然是十六进制字符串。
什么失败了,导致 hexstring 为空字符串(因此 myval =0)?
【问题讨论】:
【参考方案1】:这看起来不对:
const char *hexstring = qbyteval.toHex().toStdString().c_str();
c_str()
函数返回一个指向std::string
内部数据的指针,如果您修改或销毁std::string
,该指针可能会失效。在这种情况下,std::string
在该行运行后立即被销毁,因为您没有将其存储在变量中。
您的代码中可能还有更多类似的错误,但这是最明显的错误。如果您仍然遇到问题,我建议发布一个最小的、完整的示例,更好地解释预期行为与实际行为,并使用调试器查看每一行发生的情况。
【讨论】:
对不起,大卫。现在我明白你们在说什么了......我误解了你在谈论“data()”函数......但现在我清楚了我将它分配给“const Char *”时犯了什么错误...... .我搞砸的主要原因是,我在这里使用了一个变量进行测试....那个变量是在某些标题中声明的RWCString......现在我有一个问题? .... rougewave 字符串如何能够保持它?我的意思是“RWCString str = qstr.toLatin1().data()”......做得很好。如果您希望我将其作为问题发布,我会这样做。 toLatin1() 再次返回一个 QByteArray。很抱歉再次出现沟通障碍......完全搞砸了,浪费了你的时间...... RWCString,如果它像std::string,可能有一个构造函数将所有数据复制出char指针。【参考方案2】:要从字节数组中获取const char*
,您必须确保缓冲区不是临时的,并且比指针的任何和所有使用都长:
void function(const QByteArray & byteVal)
auto const hex = byteVal.toHex();
mpz_t myval;
mpz_init (myval);
mpz_set_str(myval, hex.data(), 16);
...
【讨论】:
【参考方案3】:这为我解决了。我没有初始化 myval。
mpz_t myval;
mpz_set_str(myval.backend().data(), hexstring, 16);
【讨论】:
以上是关于QByteArray 转换为十六进制失败的主要内容,如果未能解决你的问题,请参考以下文章