给出一串十六进制字符,我想从这些字符串创建一个字节数组。例如。给定字符串“ 1A2B3C”,我希望我的数组包含0x1A,0x2B,0x3C。
我可以使用下面的代码运行它,但是希望看到一种更有效的方法。
(到目前为止,已经完成了对字符串长度等的检查)。
// Go through the string
int k = 0;
stringstream s;
for (int i = 0; i < STRING_SIZE; i++)
{
// Get 2 digits at a time and store in a temp variable
s.str("");
s << key[k++];
s << key[k++];
char temp[2];
memcpy(temp, s.str().c_str(), 2);
// Get the hex value and store in final array
actualArray[i] = (unsigned char)strtol(temp, 0, 16);
}
答案 0 :(得分:4)
假设key
是std::string
,则循环的主体可能就是:
actualArray[i] = (unsigned char)std::stol(key.substr(i*2, 2), 0, 16);
如果key是一个char数组,它将是:
actualArray[i] = (unsigned char)std::stol(std::string(key + i*2, 2), 0, 16);
答案 1 :(得分:3)
您可以使用类似的东西
#include <string>
#include <vector>
#include <cstdint>
#include <cassert>
std::uint8_t char_to_nibble(char c)
{
assert((c>='0' && c<='9') || (c>='A' && c<='F'));
if ((c >= '0') && (c <= '9'))
return c-'0';
else
return c-'A' + 0xA;
}
void str2ba(const std::string &src, std::vector<std::uint8_t> &dst)
{
assert(src.size() % 2 == 0);
dst.reserve(src.size()/2);
dst.clear();
auto it = src.begin();
while(it != src.end()) {
std::uint8_t hi = char_to_nibble(*it++);
std::uint8_t lo = char_to_nibble(*it++);
dst.push_back(hi*16+lo);
}
}
答案 2 :(得分:3)
您无需遍历字符串流即可获取十六进制值。直接将char
映射到int
并使用位移来获取十六进制字符表示的十进制值。
unsigned int getInt(char c)
{
if ( isdigit(c) )
{
return c-'0';
}
if ( c >= 'a' && c <= 'f' )
{
return (c - 'a' + 10);
}
if ( c >= 'A' && c <= 'F' )
{
return (c - 'A' + 10);
}
assert(false);
// Keep the compiler happy.
return 0;
}
并将其用作:
for (int i = 0; i < STRING_SIZE; i += 2)
{
int hex = getInt(key[i]) << 4 + getInt(key[i+1]);
// Add hex to the array where you wish to store it.
}