在C ++中将十六进制转换为uint8_t

时间:2018-03-24 19:35:02

标签: c++ hex uint8t

我在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_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 个答案:

答案 0 :(得分:3)

您可以使用以下功能:

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;
}
祝你好运!

答案 1 :(得分:-1)

  • 列表项

看起来它很有用,但是你应该努力将所有内容排成一行 - 将所有内容放在同一个块中(代码部分带有{})排成一行,然后在{并将每个}放在一个新行之后进行操作。或者遵循其他一些编码标准,我不在乎。只需将它排成一行并缩进。

此外,你可以通过使tmp只是一个char(不是一个数组),然后使用它来存储第三个字符,将该字符设置为NULL,然后在strtol之后恢复它,使它变得更有效率。

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;
}