我没有看到像sprintf()这样的选项。
如何将字母F转换为255?基本上是使用sprintf中的%x格式进行转换的反向操作?
我假设这很简单,我很遗憾。
答案 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的值传递给字符转换,则忽略高位。