【问题标题】:unsigned char* values to hexadecimal [duplicate]无符号字符*值到十六进制[重复]
【发布时间】:2016-06-10 11:53:24
【问题描述】:

我有一个典型的用例,我需要将 unsigned char 值转换为十六进制。

例如,

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

STEP 1:我需要将这个 pBuffer 值拆分如下,

{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 的任何想法?对此的任何帮助将不胜感激

【问题讨论】:

  • 不需要第 2 步。你可以改用{ 0xEB, 0xA5, ...}
  • 有什么问题?
  • 谢谢,您知道如何实现 STEP1 吗?

标签: c++ c


【解决方案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;
}

【讨论】:

  • 我认为这是最简单的解决方案,如果正确包装在一个函数中。 C 函数通常是好的、“高性能”和简单的解决方案,前提是您已正确清理输入
  • @lllishar,该解决方案对我来说看起来不错。但我正在尝试将其转换为 C++。您对 c++ 中的“sscanf”等效部分有任何想法吗?
  • 除非您的意思是“如何将它与 iostream 结合”,否则按原样使用它应该不是问题。 C++ 也可以使用 ansi c 函数。只需包含 stdio。
【解决方案2】:

您可以创建一个将两个无符号字符作为参数并返回另一个无符号字符的函数。这两个参数是字符(第一个字节的 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;
}

基本思想是计算字符的数值并从两个字符重新组合一个数字(因此是位移)

我很确定这里和那里有多种比我更优雅的解决方案。

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 2023-04-11
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 2015-05-05
      • 2016-12-27
      相关资源
      最近更新 更多