2016-06-10 59 views
-5

我有一個典型的用例,我需要將無符號字符值轉換爲十六進制。無符號字符*值爲十六進制

例如,

unsigned char *pBuffer = (unsigned char *)pvaluefromClient //where pvaluefromclient is received from a client 

p緩衝器的長度是32個字節,並將其保持值,如下所示,

(gdb) p pBuffer 
$5 = (unsigned char *) 0x7fd4b82cead0 "EBA5F7304554DCC3702E06182AB1D487" 
(gdb) n 

步驟1:我需要如下拆分此p緩衝器值,

{EB,A5,F7,30,45,54,DC,C3,70,2E,06,18,2A,B1,D4,87 } 

第2步:我需要將上面的分隔值轉換爲十進制,如下所示:

const unsigned char pConvertedBuffer[16] = { 
    235,165,247,48,69,84,220,195,112,46,6,24,42,177,212,135 
}; 

關於如何實現STEP1和STEP2的任何想法?任何幫助將不勝感激

+1

步驟不需要2。您可以改爲使用「{0xEB,0xA5,...}」。 – glglgl

+1

問題是什麼? – KABoissonneault

+1

謝謝,有關如何實現STEP1的任何想法? –

回答

0

您可以創建一個函數,它將兩個無符號字符作爲參數,並返回另一個無符號字符。這兩個參數是字符(第一個字節的E和B)。返回的值將是字節的數值。

邏輯將是:

unsigned char hex2byte(unsigned char uchar1, unsigned char uchar2) { 
    unsigned char returnValue = 0; 

    if((uchar1 >= '0') && (uchar1 <= '9')) { 
     returnValue = uchar1 - 0x30; //0x30 = '0' 
    } 
    else if((uchar1 >= 'a') && (uchar1 <= 'f')) { 
     returnValue = uchar1 - 0x61 + 0x0A; //0x61 = 'a' 
    } 
    else if((uchar1 >= 'A') && (uchar1 <= 'F')) { 
     returnValue = uchar1 - 0x41 + 0x0A; //0x41 = 'A' 
    } 

    if((uchar2 >= '0') && (uchar2 <= '9')) { 
     returnValue = (returnValue <<8) + (uchar2 - 0x30); //0x30 = '0' 
    } 
    else if((uchar2 >= 'a') && (uchar2 <= 'f')) { 
     returnValue = (returnValue <<8) + (uchar2 - 0x61 + 0x0A); //0x61 = 'a' 
    } 
    else if((uchar2 >= 'A') && (uchar1 <= 'F')) { 
     returnValue = (returnValue <<8) + (uchar2 - 0x41 + 0x0A); //0x41 = 'A' 
    }   

    return returnValue; 
} 

的基本思想是,計算字符的數值和重新組裝從兩個字符的數(因此比特移位)

我很當然,在這裏和那裏有更多優雅的解決方案。

1

怎麼是這樣的:

unsigned char *pBuffer = (unsigned char *)pvaluefromClient //where valuefromclient is received from a client 

int i, j; 
unsigned char target[16] 
for(i=0;i<32;i+=2) 
{ 
    sscanf((char*)&pBuffer[i], "%02X", &j); 
    target[i/2] = j; 
} 
+0

我認爲這是最簡單的解決方案,如果包裝正確的功能。如果你已經正確地清理了輸入 – KABoissonneault

+0

@lllishar,那麼''C'函數通常是好的,「高性能」和簡單的解決方案,該解決方案對我來說看起來很好。但我想在C++中轉換它。你對C++中的「sscanf」等價部分有任何想法嗎? –

+0

除非你的意思是「如何將這個與iostream結合起來」,否則按原樣使用它應該不成問題。 C++也可以使用ansi c函數。只包括stdio。 – Illishar

0
void Conversion(char *pBuffer, int *ConvertedBuffer) 
{ 
    int j = 0; 
    for(int i = 0; i < 32; i += 2) 
    { 
     std::stringstream ss; 
     char sz[4] = {0}; 

     sz[0] = pBuffer[i]; 
     sz[1] = pBuffer[i+1]; 
     sz[2] = 0; 

     ss << std::hex << sz; 
     ss >> ConvertedBuffer[j]; 
     ++j; 
    } 
} 
int main() 
{ 
    char Buffer[] = "EBA5F7304554DCC3702E06182AB1D487"; 
    int ConvertedBuffer[16]; 
    Conversion(Buffer, ConvertedBuffer); 
    for(int i = 0; i < 16; ++i) 
    { 
     cout << ConvertedBuffer[i] << " "; 
    } 
    return 0; 
} 

//output: 
235 165 247 48 69 84 220 195 112 46 6 24 42 177 212 135 
相關問題