如何从字符中读取 ASCII 值并将其转换为十六进制格式的字符串
How to read ASCII value from a character and convert it into hexadecimal formatted string
需要将字符的值读取为数字并找到对应的十六进制值。
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
char c = 197;
cout << hex << uppercase << setw(2) << setfill('0') << (short)c << endl;
}
输出:
FFC5
预期输出:
C5
问题是,当您使用 char c = 197
时,您会溢出 char
类型,产生一个负数 (-59
)。从那里开始,无论您对更大的类型进行何种转换,它都将保持为负数。
要完全理解为什么您必须了解 two's complement 的工作原理。
基本上,-59
和 192
具有相同的二进制表示形式:1100 0101
,具体取决于以一种或另一种方式解释的数据类型。当您使用十六进制格式打印时,使用的是二进制表示形式(存储在内存中的实际值),生成 C5
.
当 char
转换为 short
/unsigned short
时,它正在将 -59
转换为其 short
/unsigned short
表示,这两种情况都是 1111 1111 1100 0101
(FFC5
)。
正确的做法是将初始值 (197
) 存储到数据类型能够表示它的变量中 (unsigned char
, short
, unsigned short
, ...) 从头开始。
需要将字符的值读取为数字并找到对应的十六进制值。
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
char c = 197;
cout << hex << uppercase << setw(2) << setfill('0') << (short)c << endl;
}
输出:
FFC5
预期输出:
C5
问题是,当您使用 char c = 197
时,您会溢出 char
类型,产生一个负数 (-59
)。从那里开始,无论您对更大的类型进行何种转换,它都将保持为负数。
要完全理解为什么您必须了解 two's complement 的工作原理。
基本上,-59
和 192
具有相同的二进制表示形式:1100 0101
,具体取决于以一种或另一种方式解释的数据类型。当您使用十六进制格式打印时,使用的是二进制表示形式(存储在内存中的实际值),生成 C5
.
当 char
转换为 short
/unsigned short
时,它正在将 -59
转换为其 short
/unsigned short
表示,这两种情况都是 1111 1111 1100 0101
(FFC5
)。
正确的做法是将初始值 (197
) 存储到数据类型能够表示它的变量中 (unsigned char
, short
, unsigned short
, ...) 从头开始。