代码之家  ›  专栏  ›  技术社区  ›  Elie Daher

在C中将十六进制转换为uint8\u t++

  •  3
  • Elie Daher  · 技术社区  · 7 年前

    我在C++中工作,假设我有以下十六进制作为字符串

    string key = "F3D5";
    

    如何将其转换为 uint8_t ?

    实际上,我有一个算法可以生成 uint8_t* ,我使用以下代码将此键转换为十六进制:

    uint8_t key = generateKey();
    vector<uint8_t> keyVector(begin(key), end(key));
    string hexadecimalKey= uint8_vector_to_hex_string(keyVector);
    

    这是将uint8矢量转换为字符串中十六进制的方法:

    string uint8_vector_to_hex_string(const vector<uint8_t>& v) {
        stringstream ss;
        ss << hex << setfill('0');
        vector<uint8_t>::const_iterator it;
    
        for (it = v.begin(); it != v.end(); it++) {
            ss << setw(2) << static_cast<unsigned>(*it);
        }
    
        return ss.str();
    }
    

    我想重新转换 hexadecimalKey 至uint8\u t,代码如下

    uint8_t* convertedKey = hex_string_to_uint8_t(hexadecimalKey);
    

    使用以下方法:

    uint8_t* hex_string_to_uint8_t(string value) {
        size_t len = value.length();
        vector<uint8_t> out;
        for (size_t i = 0; i < len; i += 2) {
            std::istringstream strm(value.substr(i, 2));
            uint8_t x;
            strm >> std::hex >> x;
            out.push_back(x);
        }
        return out.data();
    }
    

    每当我这样做的时候 convertedKey 不等于 key

    我需要你的帮助。

    谢谢,真的很感激

    2 回复  |  直到 7 年前
        1
  •  3
  •   Elie Daher    7 年前

    您可以使用以下功能:

    uint8_t* hex_str_to_uint8(const char* string) {
    
        if (string == NULL)
            return NULL;
    
        size_t slength = strlen(string);
        if ((slength % 2) != 0) // must be even
            return NULL;
    
        size_t dlength = slength / 2;
    
        uint8_t* data = (uint8_t*)malloc(dlength);
    
        memset(data, 0, dlength);
    
        size_t index = 0;
        while (index < slength) {
            char c = string[index];
            int value = 0;
            if (c >= '0' && c <= '9')
                value = (c - '0');
            else if (c >= 'A' && c <= 'F')
                value = (10 + (c - 'A'));
            else if (c >= 'a' && c <= 'f')
                value = (10 + (c - 'a'));
            else
                return NULL;
    
            data[(index / 2)] += value << (((index + 1) % 2) * 4);
    
            index++;
        }
    
        return data;
    }
    

    祝你好运

        2
  •  -1
  •   معاذ حسن الرحبي    7 年前
    • 列表项目

    看起来是可行的,但您应该将所有内容排列起来——将同一块中的所有内容(带有{}的代码部分)排列起来,然后在{之后添加intent,并将每个}放在新行上。或者遵循其他编码标准,我不在乎。只要把它排成一行,缩进就行了。

    此外,您还可以通过将tmp设置为一个字符(而不是数组),然后使用它存储第三个字符,将该字符设置为NULL,然后在strol之后恢复它,从而使其更加高效。


    char buf[] = "4142434445";
    uint8_t tx_buffer[20];
    uint8_t len_buffer=0;
    
    
    for(i=0;i<strlen(buf);i+=2) {
    char tmp = buf[i+3];
    buf[i+3] = 0;
    tx_buffer[len_buffer] = strtol(buf,NULL,16);
    len_buffer++;
    buf[i+3] = tmp;
    }
    
    推荐文章