2016-06-10 3 views
-5

У меня типичный прецедент, где мне нужно преобразовать значения unsigned char в шестнадцатеричные.unsigned char * values ​​to hexadecimal

Например,

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

Длина пиксельный буфер составляет 32 байта и содержит значение следующим образом,

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

ШАГ 1: мне нужно разделить это значение пиксельный буфер следующим образом,

{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

Вы можете создать функцию, которая принимает два символа unsigned в качестве параметра и возвращает еще один символ без знака. Два параметра - это символы (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

Я думаю, что это самое простое решение, если оно выполнено правильно в функции. Функции 'C' обычно бывают хорошими,« перформантными »и простыми решениями при условии, что вы правильно обработали вход – KABoissonneault

+0

@lllishar. Решение отлично подходит для меня. Но я пытаюсь преобразовать это в C++. Есть ли у вас какие-либо идеи относительно эквивалентной части sscanf в C++? –

+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