我现在一直在寻找和试验很多很多小时,到目前为止,我还没有能够适应我遇到的任何解决方案来做我想做的事。
我的目标是取一个整数(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;
}
答案 0 :(得分:6)
无需转换为字符串表示形式。
查看以下示例:
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::dec
和std::hex
,您可以告诉ostream对象如何从int表示创建字符串。