2016-06-10 135 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 
相关问题