【问题标题】:c++ convert integer to 8 char hex, drop the first two char so that it is only a 6 char hex, and convert back to an integerc++ 将整数转换为 8 char hex,删除前两个 char 使其仅为 6 char hex,然后转换回整数
【发布时间】:2016-08-04 05:35:48
【问题描述】:

我已经搜索和试验了很多很多小时,但到目前为止,我无法调整我遇到的任何解决方案来做我想做的事。

我的目标是取一个整数 (538214658) 并将其转换为 8 个字符的十六进制字符串 (020148102)。然后我想删除前两个字符(0148102)并将其转换回一个整数(1343746),我将其用作映射数组中的键。

到目前为止我看到的解决方案只是将整数转换为十六进制字符串,但不考虑所需的数字长度。

我可以使用以下代码仅打印前 6 个字符:

Console_Print("%06X", form ? form->refID : 0)

所以我想也许我可以使用该技术将其存储为字符串,然后使用 iostream 或 sstream 将其转换回整数,但我的搜索都没有找到我可以使用的任何东西。而且我所有的实验都失败了。

我们将不胜感激。

编辑:以下是基于 Klaus 建议的我的解决方案:

uint32_t GetCoreRefID(TESForm* form)
{
    uint32_t iCoreRefID = 0;
    if (form)
    {
        uint32_t iRefID = (uint32_t)(form->refID);
        iCoreRefID = iRefID & 0x00ffffff;
    }
    return iCoreRefID;
}

【问题讨论】:

  • 在您的第一个建议中,您也可以将其写成简短的:return form?0x00ffffff & (form->refID):0。我不知道哪种类型是 form->refID,但它应该可以在没有额外转换的情况下工作。但这并不意味着像这样的? 运算符:-) 你的解决方案更容易阅读,编译器会生成我相信的相同代码。

标签: c++ string integer hex data-conversion


【解决方案1】:

无需转换为字符串表示形式。

看下面的例子:

int main()
{
    uint32_t val = 538214658 & 0x00ffffff;
    std::cout << std::hex << val << std::endl;
    std::cout << std::dec << val << std::endl;

}

您必须了解,值仍然只是一个值,并且不依赖于十进制或十六进制等表示形式。存储在内存区域或寄存器中的值仍然相同。

正如您在给定示例中看到的那样,我编写了您的十进制值表示并删除了前两个十六进制数字,只需使用掩码的十六进制表示执行 bitwise and 操作即可。

此外,您必须了解,在两种不同“模式”下使用 cout 进行打印根本不会改变值,也不会改变内部表示。使用std::decstd::hex,您可以告诉 ostream 对象如何从 int 表示创建字符串。

【讨论】:

  • 不错的答案。在这个 Q 的上下文中,最好将这些值收集到 std::stringstream 中,以便使用 .str() 它可以以 std::string 的形式用于将来使用。
  • 据我了解,任何字符串都没有“未来用途”,因为 OP 的目标是将值用作映射的键​​。
  • 其实std::dec/std::hex支持operator&lt;&lt;。现在,我们可以使用std::cout 对象或任何std::stringstream 对象。如果使用std::cout,那么该值将简单地打印在控制台上,虽然我们可以看到它,但不能使用它。但是,如果使用stringstream,则使用其对象的.str() 方法,该值可用于任何(未来)目的。我的假设是,OP 可能不知道如何收集值以便将其用于映射键。 Demo。进一步转换 std::stoi() 可用于恢复。
  • 我明白你的意思。但这听起来是 xy 问题的解决方案。 OP 尝试使用不需要的 int->string->int 转换。您的评论解释了如何完成字符串部分。我的回答完全通过字符串删除了 xy 解决方案,因为它不是必需的。就这样。如果问题涉及字符串转换,那么您是对的。也许我还没有理解这个问题,所以您的解决方案适合 OP 的需要。我不知道。
  • 克劳斯,我将更新我的 OP 以证明我对您的解决方案的理解。
猜你喜欢
  • 2013-04-03
  • 2015-08-18
  • 2012-06-01
  • 2020-04-15
  • 2013-12-02
  • 1970-01-01
  • 2015-07-11
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多