假设我有一个包含十六进制数字的字符串,其中每 2 个十六进制数字代表 ASCII 集中的一个字符,我需要将包含十六进制数字的字符串转换回其等效字符
我在这段代码中找到了我想要的东西:-
#include <algorithm>
#include <stdexcept>
std::string hex_to_string(const std::string& input)
{
static const char* const lut = "0123456789ABCDEF";
size_t len = input.length();
if (len & 1) throw std::invalid_argument("odd length");
std::string output;
output.reserve(len / 2);
for (size_t i = 0; i < len; i += 2)
{
char a = input[i];
const char* p = std::lower_bound(lut, lut + 16, a);
if (*p != a) throw std::invalid_argument("not a hex digit");
char b = input[i + 1];
const char* q = std::lower_bound(lut, lut + 16, b);
if (*q != b) throw std::invalid_argument("not a hex digit");
output.push_back(((p - lut) << 4) | (q - lut));
}
return output;
}
我对 C++ 比较陌生,我可以理解直到部分 output.push_back(((p - lut) << 4) | (q - lut));
假设字符串包含 72 的十六进制值(表示 ACSII 中的 char 'r')并且就在输出字符串的 push_back 操作之前,p 和 lut 的值将是:- p = "789ABCDEF" lut = "0123456789ABCDEF "
但是,这个函数中的 (p - lut) 结果是 7。我不太明白这是怎么发生的。??