0

我只想知道如何将 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;

有人可以帮助我吗?在此先感谢您的帮助。

4

6 回答 6

6

单个char从不包含十六进制。就此而言,也不是十进制。严格来说, achar包含一个整 数值;C++ 标准要求它使用二进制表示的值。该值可以解释为一个字符,但并非总是如此;在某些情况下直接使用整数值。

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

于 2013-05-16T11:36:19.930 回答
3
for(int i = 0; i < 3; ++i)
    rgb_int[i] = (unsigned char)rgb_hexa[i];

char是 C 和 C++ 中的整数类型,就像short,intlong. 它只是最小的整数类型。大多数情况下,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};

这都一样。

于 2013-05-16T11:35:35.910 回答
0

对于类型转换,有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;

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

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

于 2013-05-16T12:19:07.470 回答
0

为什么你不能这样做

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;
}

很直接..

于 2013-05-16T11:59:05.327 回答
0

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

int v = (int)rgb_hexa[0];

您应该知道,尽管使用带符号的字符,它们将是符号扩展端。转换为 int 时也是0xFA如此。0xFFFFFFFA

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

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
于 2013-05-16T11:39:19.313 回答
0

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

例如,十六进制的 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;
于 2013-05-16T11:49:32.143 回答