如何将字符(字节)中包含的十六进制值转换为整数
How to convert a hexadecimal value contained in a char (byte) to an integer?
我只想知道如何将包含在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++就像short
、int
和long
一样。它只是最小的整数类型。大多数情况下,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 char
和unsigned 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;
dest
和source
具有相同的二进制含义,但它们属于不同的类型。
我使用了无符号类型,因为有符号字符存储的值通常在-127到127之间,请参阅限制。
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将十六进制转换为 DEC
- 将字符指针中的十六进制转换为十进制
- 使用 std::hex 将十六进制转换为十进制
- 将40个字节长的数据框从十六进制转换为二进制,然后转换为十进制
- 如何将十六进制转换为十进制
- 在C++中将十六进制转换为uint8_t
- 从十六进制转换为LPCVoid,切断了一半地址
- 将十六进制转换为可打印的字符串/字符
- 将 QString 十六进制转换为 ASCII 值
- 我如何在 C++ 中将变量从十六进制转换为 dec
- 混淆在C++中将十六进制转换为二进制
- C++中的十进制到十六进制转换代码
- 如何在C++中将十六进制转换为IEEE 754 32位浮点
- 十进制到十六进制转换错误
- 十进制到十六进制转换c++内置函数
- 如何将十六进制转换为字符串?C++
- 将 3d 数组元素从十六进制转换为二进制以获得 bmp
- C++:将十六进制转换为十进制
- 将十六进制转换为签名的十二月