2013-05-16 23 views
0

我只想知道如何将char(byte)中包含的十六进制值转换为整数。我想从一个.bmp文件转换颜色缓冲区,当然这个文件是十六进制的,并将它转换为整数。如何将char(byte)中包含的十六进制值转换为整数?

例如:

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

转换后:

int rgb_int[3] = {168, 244, 211}; 

我总是试图使用与strtol,但它似乎只能用炭工程*。我试图做下面的测试,但它不起作用:

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; 

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

+3

你不需要做任何事情。整数字面值'0xA8'和'168'是相同的,它只是写出完全相同的东西以使程序员更容易的不同方式。编译器在编译的二进制文件中放入相同的**二进制**表示。 –

+1

@JoachimPileborg - 你需要将其转换为无符号的 - 168不仅仅适用于'char'。 – user93353

+0

@ user93353这取决于。如果使用MSVC编译'/ J'选项,'168'将适合'char'。但更普遍的是,你必须转换为'unsigned char',或'0xFF'。后者甚至可以在具有9位字节的机器上工作(但我不知道任何在哪里清单'char'被签名)。 –

回答

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

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

这都是一样的。

+0

unsigned char是我的答案。没有意识到char被签署了。这个问题不应该得到降低。这对初学者来说是一场真正的斗争...... – Fr4nc3sc0NL

6

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

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

0

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

int v = (int)rgb_hexa[0]; 

你应该知道,尽管使用signed char,它们将会是sign 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 
+0

普通'char'可以是有符号或无符号的。由于历史原因,它通常(但并非总是)默认为已签名,但大多数编译器都可以选择使其未经签名(您应该使用 - 可以使用已签名的字符是一种可怕的黑客攻击)。 –

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

相当直截了当..

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具有相同的二进制含义,但它们是不同的类型。

我已经使用了无符号类型,因为signed char存储通常是从-127到127的值,请参阅limits

相关问题