我有一个const char*
, 指向一个包含 8 个字符的数组(可能是较大字符串的一部分),其中包含一个十六进制值。我需要一个将这些字符转换为 4 数组的函数uint8_t
,其中源数组中的前两个字符将成为目标数组中的第一个元素,依此类推。例如,如果我有这个
const char* s = "FA0BD6E4";
我希望它转换为
uint8_t i[4] = {0xFA, 0x0B, 0xD6, 0xE4};
目前,我有这些功能:
inline constexpr uint8_t HexChar2UInt8(char h) noexcept
{
return static_cast<uint8_t>((h & 0xF) + (((h & 0x40) >> 3) | ((h & 0x40) >> 6)));
}
inline constexpr uint8_t HexChars2UInt8(char h0, char h1) noexcept
{
return (HexChar2UInt8(h0) << 4) | HexChar2UInt8(h1);
}
inline constexpr std::array<uint8_t, 4> HexStr2UInt8(const char* in) noexcept
{
return {{
HexChars2UInt8(in[0], in[1]),
HexChars2UInt8(in[2], in[3]),
HexChars2UInt8(in[4], in[5]),
HexChars2UInt8(in[6], in[7])
}};
}
这是我从哪里调用它的样子:
const char* s = ...; // the source string
std::array<uint8_t, 4> a; // I need to place the resulting value in this array
a = HexStr2UInt8(s); // the function call does not have to look like this
我想知道,有没有更有效(和便携)的方式来做到这一点?例如,返回是std::array
一件好事,还是应该将dst
指针传递给HexChars2UInt8
? 或者还有其他方法可以改善我的功能吗?
我问这个的主要原因是因为我可能需要在某个时候优化它,如果将来更改 API(函数原型)会出现问题。