[英]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];
char
是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];
您應該知道,盡管使用簽名字符,它們將是符號擴展。 因此,將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
您不需要進行任何轉換,因為十六進制/十進制只是表示值的方式。
例如,十六進制的0xA8與十進制的180和八進制的250相同。 例如,在語言中,“兩個”,“雙拼”和“ 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
具有相同的二進制含義,但是它們的類型不同。
我使用了無符號類型,因為帶符號的char通常存儲從-127到127的值,請參閱limits 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.