C++ 无符号字符*值转换为十六进制
我有一个典型的用例,需要将无符号字符值转换为十六进制 比如说,C++ 无符号字符*值转换为十六进制,c++,c,C++,C,我有一个典型的用例,需要将无符号字符值转换为十六进制 比如说, unsigned char *pBuffer = (unsigned char *)pvaluefromClient //where pvaluefromclient is received from a client pBuffer的长度为32字节,其值如下所示 (gdb) p pBuffer $5 = (unsigned char *) 0x7fd4b82cead0 "EBA5F7304554DCC3702E06182AB1
unsigned char *pBuffer = (unsigned char *)pvaluefromClient //where pvaluefromclient is received from a client
pBuffer的长度为32字节,其值如下所示
(gdb) p pBuffer
$5 = (unsigned char *) 0x7fd4b82cead0 "EBA5F7304554DCC3702E06182AB1D487"
(gdb) n
{EB,A5,F7,30,45,54,DC,C3,70,2E,06,18,2A,B1,D4,87 }
const unsigned char pConvertedBuffer[16] = {
235,165,247,48,69,84,220,195,112,46,6,24,42,177,212,135
};
步骤1:我需要按如下方式拆分此pBuffer值
(gdb) p pBuffer
$5 = (unsigned char *) 0x7fd4b82cead0 "EBA5F7304554DCC3702E06182AB1D487"
(gdb) n
{EB,A5,F7,30,45,54,DC,C3,70,2E,06,18,2A,B1,D4,87 }
const unsigned char pConvertedBuffer[16] = {
235,165,247,48,69,84,220,195,112,46,6,24,42,177,212,135
};
步骤2:我需要将上述拆分值转换为十进制,如下所示:
(gdb) p pBuffer
$5 = (unsigned char *) 0x7fd4b82cead0 "EBA5F7304554DCC3702E06182AB1D487"
(gdb) n
{EB,A5,F7,30,45,54,DC,C3,70,2E,06,18,2A,B1,D4,87 }
const unsigned char pConvertedBuffer[16] = {
235,165,247,48,69,84,220,195,112,46,6,24,42,177,212,135
};
你知道如何实现第一步和第二步吗?您可以创建一个函数,将两个无符号字符作为参数并返回另一个无符号字符。这两个参数是字符(第一个字节为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;
}
unsigned char hex2byte(unsigned char uchar1,unsigned char uchar2){
无符号字符返回值=0;
如果((uchar1>='0')&&&(uchar1='a')&&&(uchar1='a')&&(uchar1='0')&&(uchar2这样的东西怎么样:
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;
}
unsigned char*pBuffer=(unsigned char*)pvaluefromClient//其中从客户端接收valuefromclient
int i,j;
无符号字符目标[16]
对于(i=0;ivoid转换(char*pBuffer,int*ConvertedBuffer)
{
int j=0;
对于(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-ConvertedBuffer[j];
++j;
}
}
int main()
{
字符缓冲区[]=“EBA5F7304554DCC3702E06182AB1D487”;
int ConvertedBuffer[16];
转换(Buffer,ConvertedBuffer);
对于(int i=0;i<16;++i)
{
不需要第2步。你可以改为{0xEB,0xA5,…}
。问题是什么?谢谢,关于如何实现第1步有什么想法吗?你知道吗?我认为这是最简单的解决方案,如果正确地包装在一个函数中。C
函数通常很好,“performant”以及简单的解决方案,前提是您已对input@lllishar这个解决方案看起来不错。但是我尝试用C++来转换这个。你对C++中的“sSCANF”等价部分有什么想法吗?除非你是指“如何将这个与iOrtho结合起来”。使用它不应该是一个问题。C++也可以使用ANSI C函数。只需包含STDIO。