Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无符号字符*值转换为十六进制_C++_C - Fatal编程技术网

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;i
void转换(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。