【问题标题】:Converting HEXA 64 bits numbers to int将 HEXA 64 位数字转换为 int
【发布时间】:2021-11-18 11:02:42
【问题描述】:

我正在做一份大学工作,一个包含在字符串流中的十六进制数字之间的转换。我有一个大的十六进制数(一个私钥),我需要转换为 int,以放入 map。 所以当我运行代码时,插入的所有两个十六进制值的转换结果都是相同的,不正确的,应该是转换后的不同结果。我认为这是一个 int 大小堆栈问题,因为当我插入短 hexas 时,它的效果很好。如下所示,hexa 有 64 位。

有什么办法让它工作吗?

int main() 
{
    unsigned int x;   
    std::stringstream ss;
    ss << std::hex << "0x3B29786B4F7E78255E9F965456A6D989A4EC37BC4477A934C52F39ECFD574444";
    ss >> x;

    std::cout << "Saida" << x << std::endl;
    // output it as a signed type
    std::cout << "Result 1: " << static_cast<std::int64_t>(x) << std::endl;

    ss << std::hex << "0x3C29786A4F7E78255E9A965456A6D989A4EC37BC4477A934C52F39ECFD573344";
    ss >> x;
    std::cout << "Saida 2 " << x << std::endl;
    // output it as a signed type
    std::cout << "Result 2: " << static_cast<std::int64_t>(x) << std::endl;
}

【问题讨论】:

  • 我不确定你的问题。作为字符串的十六进制数不适合 64 位整数。
  • 这是一个 64 字节长的数字。你不会混淆位和字节吗?

标签: c++ c++11 cryptography


【解决方案1】:

您需要一次处理输入的 16 个字符。每个字符为 4 位。前 16 个字符将为您提供一个无符号的 64 位值。 (16x4 是 64)

然后您可以将第一个值放入向量或其他容器中,然后移动到接下来的 16 个字符。如果您对字符串操作有任何疑问,请在此网站上搜索类似问题。

【讨论】:

    【解决方案2】:
    1. 首先,您示例中的 HEX 数字不适合无符号整数。
    2. 在加载第二个十六进制数字之前,您应该清除流。
    ...
    std::cout << "Result 1: " << static_cast<std::int64_t>(x) << std::endl;
    
    ss.clear();
    ss << std::hex << "0x3C29786A4F7E78255E9A965456A6D989A4EC37BC4477A934C52F39ECFD573344";
    ss >> x;
    ...
    

    【讨论】:

      【解决方案3】:

      每个十六进制数字等于 4 位 (0xf -> 1111b)。这些十六进制字符串都是 64 x 4 = 256 位长。您正在查看范围错误。

      【讨论】:

        猜你喜欢
        • 2020-10-30
        • 2015-09-19
        • 1970-01-01
        • 2012-07-26
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        相关资源
        最近更新 更多