如何将字符(字节)中包含的十六进制值转换为整数

How to convert a hexadecimal value contained in a char (byte) to an integer?

本文关键字:十六进制 转换 整数 包含 字符 字节      更新时间:2023-10-16

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

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

单个char从不包含十六进制。也不是十进制,对于这很重要。严格地说,一个char包含一个积分;C++标准要求它使用二进制值的表示。该值可以解释为一个角色,但情况并非总是如此;有上下文其中直接使用积分值。

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

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

CCD_ 3是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};

一切都一样。

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

int v = (int)rgb_hexa[0];

不过,您应该知道,使用有符号的char,它们将是符号扩展。因此0xFA在转换为内部时变为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

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

例如,十六进制中的0xA8与十进制中的180和八进制中的250是相同的值。例如,在语言中,"two"、"deux"answers"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;

为什么你不能做这个

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

非常直率。。

对于类型转换,有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之间,请参阅限制。