wlsk888 2022-05-24 12:08 采纳率: 90.9%
浏览 22
已结题

c++ 如何完成以下转换

string hexstr = "0011223300aabbccAABBCC00";
char chexstr[]= "0011223300aabbccAABBCC00";
const char* phexstr = "0011223300aabbccAABBCC00";

unsigned char hexchar[] = { 0x00,0x11,0x22,0x33,0x00,0xAA,0xBB,0xCC,0xAA,0xBB,0xCC,0x00 };

//怎么把上面未知长度的16进制字符串转换成unsigned char hexchar[]
  • 写回答

2条回答 默认 最新

  • 特立独行的猫a 嵌入式领域优质创作者 2022-05-24 13:51
    关注

    这个有多个方法可以解:
    方法一:
    从C ++ 17开始,还有std :: from_chars。以下函数采用十六进制字符的字符串并返回T的向量:

    #include <charconv>
    template<typename T>
    std::vector<T> hexstr_to_vec(const std::string& str, unsigned char chars_per_num = 2)
    {
      std::vector<T> out(str.size() / chars_per_num, 0);
    
      T value;
      for (int i = 0; i < str.size() / chars_per_num; i++) {
        std::from_chars<T>(
          str.data() + (i * chars_per_num),
          str.data() + (i * chars_per_num) + chars_per_num,
          value,
          16
        );
        out[i] = value;
      }
      return out;
    }
    

    当然,给出的示例是使用的c++17的charconv
    C++17提供了一组高性能,不抛出,不依赖本地环境的转换函数。在高吞吐量的环境下有良好的表现。
    std::from_chars

    
    ```c++
    #include <charconv>
    struct from_chars_result {
        const char *ptr;
        std::errc ec;
    };
    
    enum class chars_format {
        scientific = /*unspecified*/,
        fixed = /*unspecified*/,
        hex = /*unspecified*/,
        general = fixed | scientific
    };
    
    std::from_chars_result from_chars(const char *frist,
        const char *last, /* integer */ &value, int base = 10);//c++17
    std::from_chars_result from_chars(const char *frist,
        const char *last, /* floating */ &value,
        std::char_format fmt = std::chars_format::general); //c++17
    
    
    或者,使用c代码也能解:
    
    // 把十六进制字符串,转为字节码,每两个十六进制字符作为一个字节
    unsigned char* HexToByte(const char* szHex)
    {
        if (!szHex)
            return NULL;
    
        int iLen = strlen(szHex);
    
        if (iLen <= 0 || 0 != iLen % 2)
            return NULL;
    
        unsigned char* pbBuf = new unsigned char[iLen / 2];  // 数据缓冲区
    
        int tmp1, tmp2;
        for (int i = 0; i < iLen / 2; i++)
        {
            tmp1 = (int)szHex[i * 2] - (((int)szHex[i * 2] >= 'A') ? 'A' - 10 : '0');
    
            if (tmp1 >= 16)
                return NULL;
    
            tmp2 = (int)szHex[i * 2 + 1] - (((int)szHex[i * 2 + 1] >= 'A') ? 'A' - 10 : '0');
    
            if (tmp2 >= 16)
                return NULL;
    
            pbBuf[i] = (tmp1 * 16 + tmp2);
        }
    
        return pbBuf;
    }
    
    

    ```

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月2日
  • 已采纳回答 5月25日
  • 创建了问题 5月24日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来