我只想知道如何将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;
有人可以帮我吗? 在此先感谢您的帮助。
答案 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 ++就像short
,int
和long
一样。它只是最小的整数类型。大多数情况下,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 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
答案 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;
dest
和source
具有相同的二进制含义,但它们的类型不同。
我使用了无符号类型,因为签名的char存储通常值为-127到127,请参阅limits。