繁体   English   中英

如何以快速安全的方式将十六进制字符串转换为无符号64位(uint64_t)整数?

[英]how to convert hex string to unsigned 64bit (uint64_t) integer in a fast and safe way?

我试过了

sscanf(str, "%016llX", &int64 );

但似乎不安全。 是否有快速安全的方式进行型式铸造?

谢谢〜

不要打扰scanf系列中的功能。 它们几乎不可能强有力地使用。 这是strtoull的一般安全用法:

char *str, *end;
unsigned long long result;
errno = 0;
result = strtoull(str, &end, 16);
if (result == 0 && end == str) {
    /* str was not a number */
} else if (result == ULLONG_MAX && errno) {
    /* the value of str does not fit in unsigned long long */
} else if (*end) {
    /* str began with a number but has junk left over at the end */
}

请注意, strtoull在字符串上接受可选的0x前缀,以及可选的初始空格和符号字符( +- )。 如果要拒绝这些,则应在调用strtoull之前执行测试,例如:

if (!isxdigit(str[0]) || (str[1] && !isxdigit(str[1])))

如果您还希望禁止过长的数字表示(前导零),则可以在调用strtoull之前检查以下条件:

if (str[0]=='0' && str[1])

还要记住的另一件事是“负数”不被视为超出转换范围; 相反,前缀为-被视为与应用于无符号值的C中的一元否定运算符相同,因此例如strtoull("-2", 0, 16) ULLONG_MAX-1 strtoull("-2", 0, 16)将返回ULLONG_MAX-1 (不设置errno )。

您的标题(目前)与您提供的代码相矛盾。 如果你想做你最初的标题(将字符串转换为整数),那么你可以使用这个答案。


你可以使用strtoull函数,这与sscanf不同,它是一个专门用于阅读数字文本表示的函数。

const char *test = "123456789abcdef0";

errno = 0;
unsigned long long result = strtoull(test, NULL, 16);

if (errno == EINVAL)
{
    // not a valid number
}
else if (errno == ERANGE)
{
    // does not fit in an unsigned long long
}

在我写这个答案的时候,你的标题建议你想把一个uint64_t写入一个字符串,而你的代码却反过来(将一个十六进制字符串读入一个uint64_t)。 我回答“两种方式”:

<inttypes.h>头文件具有转换宏以安全地处理... _ ..._t类型:

#include <stdio.h>
#include <inttypes.h>

sprintf( str, "%016" PRIx64, uint64 );

或者(如果这确实是你想要做的事情),反过来说:

#include <stdio.h>
#include <inttypes.h>

sscanf( str, "%" SCNx64, &uint64 );

请注意,您无法使用scanf()函数系列强制执行宽度等。 它解析它得到的东西,当输入不符合预期的格式时,会产生不希望的结果。 哦, scanf()函数系列只知道(小写)“x”,而不是(大写)“X”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM