【问题标题】:Converting a Char to Its Int Representation将 Char 转换为其 Int 表示形式
【发布时间】:2011-01-05 23:39:56
【问题描述】:

我在 sprintf() 之类的东西中看不到这个选项。

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

我假设这是我缺少的一些简单的东西。

【问题讨论】:

  • 有人应该重命名这个,他在问如何从十六进制转换为整数,而不是将字符转换为字节表示

标签: c++ char hex


【解决方案1】:
char const* data = "F";
int num = int(strtol(data, 0, 16));

查看 strtol 和 boost::lexical_cast 了解更多详细信息和选项。

【讨论】:

    【解决方案2】:

    sscanf 中使用%x 格式!

    【讨论】:

      【解决方案3】:

      使用流的 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。

      【讨论】:

      • 一个迂腐的解决方案不仅会检查转换是否成功,还会检查 iss 是否设置了 eof 标志(没有数据未读)。我已经忽略了这一点,因为即使是非常基本的错误处理也必须足够令人困惑。
      【解决方案4】:

      如果没有一些黑魔法,您无法让 (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 的值传递给字符转换,则忽略高位。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-28
        • 2015-01-20
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 2015-11-23
        相关资源
        最近更新 更多