QByteArray 转换为十六进制失败

QByteArray convert to hex fails

我在 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)?

这看起来不对:

const char *hexstring = qbyteval.toHex().toStdString().c_str();

c_str() 函数 returns 指向 std::string 中内部数据的指针,如果您修改或破坏 std::string,该指针可能会失效。在这种情况下,std::string 在该行运行后立即被销毁,因为您没有将它存储在变量中。

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

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

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

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