QByteArray转换为十六进制失败

时间:2017-04-07 20:23:26

标签: c++ qt gmp

我在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 block中设置断点,则qbyteval.toHex()始终是十六进制字符串。

什么是失败,导致hexstring为空字符串(因此myval = 0)?

3 个答案:

答案 0 :(得分:7)

这看起来不对:

c_str()

std::string函数返回指向std::string中内部数据的指针,如果修改或销毁std::string,该指针可能会失效。在这种情况下,$( document ).ready(function() { if( $('#masthead').hasClass('header-fixed') ) { $('.bdanzer-fixed').addClass('bdanzer-show'); } else { $('.bdanzer-fixed').removeClass('bdanzer-show'); } }); 会在该行运行后立即销毁,因为您没有将其存储在变量中。

您的代码中可能会出现更多这样的错误,但这是最明显的错误。如果您仍有问题,我建议发布一个最小的完整示例,并更好地解释预期行为与实际行为,并使用调试器来查看每行上发生的情况。

答案 1 :(得分:0)

要从字节数组中获取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);
  ...
}

答案 2 :(得分:0)

这为我解决了。我没有初始化myval。

mpz_t myval;
mpz_set_str(myval.backend().data(), hexstring, 16);