我正在尝试将十六进制地址转换为ulong64,如下所示,但它们都没有工作。有没有正确的转换方式?
std::string s = "0x0000029078cc0000";
ULONG64 startAdress = _strtoul_l(s.c_str(), nullptr, 16, 0);
// output is 0x00000000ffffffff
_atoi64(address);
// output is 0x0000000000000000
sscanf(s.c_str(), "%16x", &startAdress);
// output is 0x000000009078cc00
答案 0 :(得分:4)
_atoi64
仅需要十进制格式,而不是十六进制格式。
strtoll
sscanf
使用"%llx"
或"%I64x"
format specifier
您可能希望将编译器警告级别设置为4,编译器实际上可能会建议正确的格式说明符。
以下示例适用于VS2015:
ULONG64 startAdress;
std::string s = "0x0000029078cc0000";
std::cout << s << "\n";
startAdress = strtoll(s.c_str(), 0, 16);
printf("%I64x\n", startAdress);
if (sscanf_s(s.c_str(), "%llx", &startAdress) == 1)
printf("%llx\n", startAdress);
if (sscanf_s(s.c_str(), "%I64x", &startAdress) == 1)
printf("%I64x\n", startAdress);
std::cout << std::hex;
std::cout << startAdress << "\n";