【发布时间】:2011-01-05 23:39:56
【问题描述】:
我在 sprintf() 之类的东西中看不到这个选项。
如何将字母 F 转换为 255?基本上是sprintf中使用%x格式的反向转换操作?
我假设这是我缺少的一些简单的东西。
【问题讨论】:
-
有人应该重命名这个,他在问如何从十六进制转换为整数,而不是将字符转换为字节表示
我在 sprintf() 之类的东西中看不到这个选项。
如何将字母 F 转换为 255?基本上是sprintf中使用%x格式的反向转换操作?
我假设这是我缺少的一些简单的东西。
【问题讨论】:
char const* data = "F";
int num = int(strtol(data, 0, 16));
查看 strtol 和 boost::lexical_cast 了解更多详细信息和选项。
【讨论】:
在sscanf 中使用%x 格式!
【讨论】:
使用流的 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。
【讨论】:
如果没有一些黑魔法,您无法让 (s)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 位。请注意,系统之间在如何“提升”十六进制常数方面可能存在一些差异。但如果将大于 255 的值传递给字符转换,则忽略高位。
【讨论】: