我试过了

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 (不设置 errno )。

关于c - 如何以快速安全的方式将十六进制字符串转换为无符号 64 位(uint64_t)整数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4132318/

10-11 15:14