将十六进制字符串转换为unsigned int问题C ++

时间:2013-03-01 00:44:57

标签: c++

我目前正在设计代码,其中一条指令是获取十六进制字符串的前两位数并执行所需的操作。所有小于A的东西都被考虑在内。任何大于此的东西都不是,它只需要下一个数字。这搞砸了代码。

以下是转换它的行:

int x = atoi(hex.c_str);

我做错了什么?

4 个答案:

答案 0 :(得分:14)

我假设这是你的意思 - 你只想将字符串的前两个十六进制数字转换为无符号整数。我还假设字符串只包含有效的十六进制数字。如果要验证字符串,则需要为此编写一些额外的代码。

使用strtoul将十六进制字符串转换为无符号整数。还可以使用字符串类的substr()方法仅提取十六进制字符串的初始2位数。

#include <string>
#include <cstdio>
#include <cstdlib>

int main()
{
    std::string myhex = "abcdef";
    unsigned int x = strtoul(myhex.substr(0, 2).c_str(), NULL, 16);
    printf("x = %d\n", x);
}

这将是您的输出(即0xab = 171):

x = 171

答案 1 :(得分:1)

int x = strtol(hex.c_str(), NULL, 16);

如果要读取部分字符串,也可以使用sscanf。你提到过你可能只想取前两个字符:

int x;
if( 1 == sscanf(hex.c_str(), "%2x", &x) ) {
    printf( "Value is: %d\n", x );
} else {
    printf( "Conversion failed\n" );
}

注意上面的内容并不是C ++。你可以使用std::hex流修饰符(注意我这次调用了你的字符串mystr以避免混淆(特别是如果你导入了名称空间std):

int x;
std::istringstream iss(mystr);
bool ok = (iss >> std::hex >> x);

[edit]我在评论中注意到您要求转换为无符号整数。在这种情况下,为什么你没有明确地将整数声明为unsigned int

对于未签名的,您应该使用strtoul

答案 2 :(得分:1)

atoi函数需要基数10

代替使用例如strtol

阅读文档通常是个好主意。只需将函数的名称写入AltaVista(或者就此而言,谷歌)。它会为你找到一些文档

答案 3 :(得分:0)

如果您要转换为未签名,您可能希望使用strtoul - 前缀为0x或基数为16. strtol也可能有效正确,但这应该给出一个有符号的值,所以至少你可能会收到来自某些编译器的有符号和无符号混合警告。