【问题标题】:How to convert a hexadecimal value contained in a char (byte) to an integer?如何将 char(字节)中包含的十六进制值转换为整数?
【发布时间】:2013-05-11 06:39:04
【问题描述】:

我只想知道如何将 char(字节)中包含的十六进制值转换为整数。我想将颜色缓冲区从 .bmp 文件转换为十六进制,然后将其转换为整数。

例如:

char rgb_hexa[3] = {0xA8, 0xF4, 0xD3};

转换后:

int rgb_int[3] = {168, 244, 211};

我一直尝试使用 strtol,但它似乎只适用于 char *。我尝试进行以下测试,但它不起作用:

char    src_hexa_red = 0xA8;
char    src_hexa_green = 0xF4;
char    src_hexa_blue = 0xD3;

std::cout << "R=" << strtol(&src_hexa_red, (char**)NULL, 16) << ", G="
      << strtol(&src_hexa_green, (char**)NULL, 16) << ", B="
      << strtol(&src_hexa_blue, (char**)NULL, 16) << std::endl;

有人可以帮帮我吗? 提前感谢您的帮助。

【问题讨论】:

  • 您无需执行任何操作。整数文字0xA8168 是相同的,只是编写完全相同的东西的不同方式使程序员更容易。编译器将相同的 binary 表示形式放入已编译的二进制文件中。
  • @JoachimPileborg - 你需要转换为无符号 - 168 比 char 的大小要多。
  • @user93353 这取决于。如果您使用 MSVC 的 /J 选项进行编译,168 将适合 char。不过,更一般地说,您要么必须转换为 unsigned char &amp;0xFF。后者甚至可以在 9 位字节的机器上工作(但我不知道在哪里签名了普通的 char)。
  • @JamesKanze True,/J 使默认 char 无符号。

标签: c++ c hex type-conversion


【解决方案1】:

类型转换,有static_cast

unsigned char source = 168;   // note that this has for compiler same meaning as:
// unsigned char source = 0xA8;   // because data is stored in binary anyway

unsigned int dest = static_cast<int>(source);   // the conversion

std::cout << source << std::endl;

destsource 具有相同的二进制含义,但它们属于不同的类型。

我使用了无符号类型,因为有符号字符存储的值通常是 -127 到 127,请参阅 limits

【讨论】:

    【解决方案2】:

    你为什么不能这样做

    int main(int argc, char *argv[])
    {
        char rgb_hexa[3] = {0xA8, 0xF4, 0xD3};
        int rgb_int[3]  = {0,};
        int i = 0;
        for( i = 0 ; i < 3 ;i++)
            rgb_int[i] = (unsigned char)rgb_hexa[i];
    
        for( i = 0 ; i < 3 ;i++)
            printf("%d ",rgb_int[i]);
    
        return 0;
    }
    

    非常直接..

    【讨论】:

      【解决方案3】:

      您不需要进行任何转换,因为十六进制/十进制只是表示值的方式。

      例如,十六进制的 0xA8 与十进制的 180 和八进制的 250 相同。例如在语言中,“two”、“deux”和“dois”代表所有相同的数字 (2)。

      如果您想打印这些值,请执行以下操作:

      short y = (short) x & 0x00FF; // x is the char you want to print
          cout << "Value (decimal): " << y;
          cout << "Value (hexa): " << hex << y;
          cout << "Value (oct): " << oct << y;
      

      【讨论】:

        【解决方案4】:
        for(int i = 0; i < 3; ++i)
            rgb_int[i] = (unsigned char)rgb_hexa[i];
        

        char 是 C 和 C++ 中的整数类型,就像 shortintlong。它只是最小的整数类型。大多数情况下,char 是有符号的,并且可以容纳的最大值为 127。因此,如果十六进制值低于或等于 127,则您无需执行任何操作。但是,在这种情况下,您拥有的十六进制值 > 127 - 因此您必须将它们强制转换为无符号才能获得您想要的值。

        请注意,这两个语句都与编译器相同。

        char rgb_hexa[3] = {0xA8, 0xF4, 0xD3};
        char rgb_hexa[3] = {168, 244, 211};
        

        如果你愿意,你甚至可以使用八进制

        char rgb_hexa[3] = {0250, 0364, 0323};
        

        都是一样的。

        【讨论】:

        • unsigned char 是我的答案。没有意识到 char 已签名。这个问题不应该被否决。这对初学者来说是一场真正的斗争......
        【解决方案5】:

        char 数组中的值已经是二进制形式,因此如果需要,可以将它们转换为 int。

        int v = (int)rgb_hexa[0];
        

        您应该知道,虽然使用带符号的字符它们将是符号扩展。 所以0xFA 转换为 int 时变为 0xFFFFFFFA

        如果你想保留这些值,那么你应该使用unsigned charunsigned int,这取决于你想如何使用这些值。

        int v0 = (int)a[1];   <-- sign extended
        unsigned int v1 = (unsigned int)a[1];    <-- sign extended
        unsigned int v1 = (unsigned int)((unsigned char *)a)[1];   <-- not sign extended
        

        【讨论】:

        • Plain char 可以签名或未签名。由于历史原因,它通常(但不总是)默认为带符号的,但大多数编译器都可以选择使其无符号(您可能应该使用它——带符号的字符是一种可怕的黑客攻击)。
        【解决方案6】:

        单个char 从不包含十六进制。也不是小数,因为 那件事。严格来说,char 包含一个积分 ; C++ 标准要求它使用二进制文件 值的表示。该值可以解释为 一个字符,但情况并非总是如此;有上下文 其中直接使用整数值。

        十六进制和十进制只是表示值的方式 以文本格式。它们只有在处理文本时才有意义。

        【讨论】:

          猜你喜欢
          • 2014-10-10
          • 2011-12-31
          • 2013-12-14
          • 2011-08-12
          • 2012-07-23
          • 2017-09-29
          • 2012-06-05
          • 2018-03-28
          相关资源
          最近更新 更多