在 C++ 中将十六进制转换为 uint8_t
Converting hexadecimal to uint8_t in C++
我在 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
我需要你的帮助。
谢谢,非常感谢
- 列表项
看起来行得通,但您应该努力将所有内容排成一行 - 将同一块(带有 {} 的代码部分)中的所有内容排成一行,然后在 { 之后意图并将每个 } 放在一个新的线。或者遵循其他一些编码标准,我不在乎。只需使其对齐并缩进即可。
此外,您可以通过使 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;
}
您可以使用以下功能:
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;
}
祝你好运!
我在 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
我需要你的帮助。
谢谢,非常感谢
- 列表项
看起来行得通,但您应该努力将所有内容排成一行 - 将同一块(带有 {} 的代码部分)中的所有内容排成一行,然后在 { 之后意图并将每个 } 放在一个新的线。或者遵循其他一些编码标准,我不在乎。只需使其对齐并缩进即可。
此外,您可以通过使 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;
}
您可以使用以下功能:
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;
}
祝你好运!