如何将char(byte)中包含的十六进制值转换为整数?

时间:2013-05-16 11:30:10

标签: c++ c hex type-conversion

我只想知道如何将char(byte)中包含的十六进制值转换为整数。我想从.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;

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

6 个答案:

答案 0 :(得分:6)

单个char永远不会包含十六进制。也不是十进制的 那件事。严格来说,char包含一个整数 ; C ++标准要求它使用二进制文件 代表价值。该值可以解释为 一个角色,但情况并非总是如此;有背景 其中积分值直接使用。

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

答案 1 :(得分:3)

for(int i = 0; i < 3; ++i)
    rgb_int[i] = (unsigned char)rgb_hexa[i];

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

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

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

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

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

一切都是一样的。

答案 2 :(得分:0)

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

int v = (int)rgb_hexa[0];

你应该知道,虽然使用签名的字符,他们将签署extendend。 因此,0xFA在转换为int时会变为0xFFFFFFFA

如果您想保留这些值,那么您应该使用unsigned charunsigned int,这会使0x000000FA取决于您希望如何使用这些值。

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

答案 3 :(得分:0)

您不需要进行任何转换,因为hexa / decimal只是表示值的方法。

例如,十六进制的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 :(得分: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;
}

非常直接..

答案 5 :(得分: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;

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

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