【问题标题】:strtoull for arbitrary length strings in C++strtoull 用于 C++ 中的任意长度字符串
【发布时间】:2011-09-11 07:13:05
【问题描述】:

我有一个程序可以接受一个字符串,该字符串表示一个最长为 256 位的数字,我需要将其扩展到 512 位。该字符串表示一个十六进制数字。

它的工作方式是,我有将字符串转换为 64 位、128 位或 256 位数字的函数,其中 128 位函数调用 64 位函数两次,256 位函数调用128位一两次,64位要么使用strotull要么手动转换字符串。

大于 64 位的值存储在 64 位条目数组中。

这很丑陋,难以理解并且容易出错,我想把它全部扔掉。考虑到strtoull 已经很好地处理了 64 位值,我想知道是否有一些标准库可以接受任意长度的字符串并将其转换为数字数组。

这似乎是一个非常基本的字符串解析操作,我不愿意重新发明轮子。


注意:

由于许可问题(我在一家大公司工作,与采购或法律决策相去甚远),我只需要使用标准库(GNU、Boost、STL 等...),否则我只需要获取解决方案的时间过长。

【问题讨论】:

  • 我不明白,该字符串是否表示二进制、八进制或十六进制形式的数字?否则两次调用64位函数怎么生成128位的值?
  • @K-ballo:好点。数字是十六进制的。我更新了问题。
  • 这看起来并不“丑陋”,尤其是因为它有效。
  • GNU 不是一个库。它是一个操作系统(GNU (i/ˈɡnuː/)[1] 是由 GNU 项目开发的类 Unix 计算机操作系统)。你可能指的是 glibc。您已经在使用 OpenSSL 了吗? (我问是因为密码学中通常使用 128-256 位数字)
  • @Mat:它运行了五年,当时有人做了合法的事情,但出乎意料,整个事情都支离破碎了。我花了一整天的时间来调试它。它只有在你不打破任何假设的情况下才有效。既然要扩展,就想把它做好。

标签: c++ string type-conversion


【解决方案1】:

有许多库可用于处理大量数据。谷歌上出现的第一个是GMP。它是 LGPL,所以不应该有任何许可问题。

mpz_t i;
mpz_init_set_str (i, "0123456789abcdef0123456789abcdef...", 16);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多