将Char转换为其Int表示

时间:2010-01-17 01:49:05

标签: c++ char hex

我没有看到像sprintf()这样的选项。

如何将字母F转换为255?基本上是使用sprintf中的%x格式进行转换的反向操作?

我假设这很简单,我很遗憾。

4 个答案:

答案 0 :(得分:3)

char const* data = "F";
int num = int(strtol(data, 0, 16));

查看strtol和boost::lexical_cast以获取更多详细信息和选项。

答案 1 :(得分:3)

使用sscanf中的%x格式!

答案 2 :(得分:1)

使用流来实现C ++的方式:

#include <iomanip>
#include <iostream>
#include <sstream>

int main() {
    std::string hexvalue = "FF";
    int value;
    // Construct an input stringstream, initialized with hexvalue
    std::istringstream iss(hexvalue);
    // Set the stream in hex mode, then read the value, with error handling
    if (iss >> std::hex >> value) std::cout << value << std::endl;
    else std::cout << "Conversion failed" << std::endl;
}

程序打印255。

答案 3 :(得分:0)

如果没有一些黑魔法,你不能得到printf将'F'转换为255。 Printf会将字符转换为其他表示形式,但不会更改其值。这可能会显示字符转换的工作原理:

printf("Char %c is decimal %i (0x%X)\n", 'F', 'F', 'F');  
printf("The high order bits are ignored: %d: %X -> %hhX -> %c\n",  
                   0xFFFFFF46,  0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46);

产生

Char F is decimal 70 (0x46)  
The high order bits are ignored: -186: FFFFFF46 -> 46 -> F

是的,我知道你问过sprintf,但是在你再做一次打印之前,这不会给你看任何东西。

这个想法是printf的每个通用整数参数都通过提升放在堆栈(或寄存器)中。这意味着它被扩展为它的最大通用大小:字节,字符和短路通过符号扩展或零填充转换为int。这使得堆栈上的参数列表保持在合理状态。这是一个很好的约定,但它可能起源于PDP-11上堆栈的16位字方向(它全部开始)。

在printf库中(在调用的接收端),代码使用格式说明符来确定处理参数(或所有参数)的哪个部分。因此,如果格式为'%c',则仅使用8位。请注意,系统之间可能存在一些关于如何“提升”十六进制常量的变化。但是,如果将大于n的值传递给字符转换,则忽略高位。