代码之家  ›  专栏  ›  技术社区  ›  Neo

如何从字符中读取ASCII值并将其转换为十六进制格式的字符串

  •  1
  • Neo  · 技术社区  · 7 年前

    需要将字符的值读取为数字,并找到相应的十六进制值。

    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main() {
        char c = 197;
        cout << hex << uppercase << setw(2) << setfill('0') << (short)c << endl;
    }
    

    输出:

    FFC5

    预期输出:

    C5

    1 回复  |  直到 7 年前
        1
  •  2
  •   cbuchart    7 年前

    问题是当你使用 char c = 197 您正在溢出 char 类型,生成负数( -59 ). 从这里开始,无论你对更大的类型进行什么转换,它都将保持为负数。

    要完全理解为什么你必须知道怎么做 two's complement 作品

    大体上 -59 192 具有相同的二进制表示: 1100 0101 ,这取决于数据类型,它以一种或另一种方式进行解释。使用十六进制格式打印时,使用的是二进制表示法(存储在内存中的实际值),产生 C5 .

    烧焦 转换为 short / unsigned short ,它正在转换 -59 进入its 短的 / 无符号短 表示,即 1111 1111 1100 0101 ( FFC5 )对于这两种情况。

    正确的方法是存储初始值( 197 )转换为数据类型能够表示它的变量( unsigned char , 短的 , 无符号短 , ...) 从一开始。