簡體   English   中英

如何將char(字節)中包含的十六進制值轉換為整數?

[英]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 ++中的整數類型,就像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];

您應該知道,盡管使用簽名字符,它們將是符號擴展。 因此,將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

您不需要進行任何轉換,因為十六進制/十進制只是表示值的方式。

例如,十六進制的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;

destsource具有相同的二進制含義,但是它們的類型不同。

我使用了無符號類型,因為帶符號的char通常存儲從-127到127的值,請參閱limits

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM