Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 十六进制到字符串转换_C++_String - Fatal编程技术网

C++ 十六进制到字符串转换

C++ 十六进制到字符串转换,c++,string,C++,String,假设我有一个包含十六进制数字的字符串,其中每两个十六进制数字代表ASCII集中的一个字符,我需要将包含十六进制数字的字符串转换回其等效字符 我在这个代码中找到了我想要的:- #include <algorithm> #include <stdexcept> std::string hex_to_string(const std::string& input) { static const char* const lut = "0123456789ABCDEF

假设我有一个包含十六进制数字的字符串,其中每两个十六进制数字代表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++是比较陌生的,我可以理解直到输出部分。PuxiBuff-LUT

考虑下面的情况,打印出'A' 0x41是A.<

std::string str="41";
std::stringstream ss; 
ss << std::hex << str;
int i;
ss >> i;
std::cout << static_cast<char>(i);

这是指针运算

p的值不是7890ABCDEF。而是存储在p中的地址中的内容。因为p是指针,所以它的值是地址

lut指向同一数组中的元素0,p指向元素7。因此p-lut为7


对于任何n,p+n与&p[n]相同,即第n个元素的地址。在这里,这个事实是反过来使用的。

我将尝试分解正在发生的事情

 output.push_back(((p - lut) << 4) | (q - lut));
对十六进制代码的左侧部分应用4位左移位

7 << 4 == 0x70

我没有要求其他方法来做这件事。我只是想了解这是如何发生的:-p=789ABCDEF lut=0123456789ABCDEF,但是,这个函数中的p-lut会产生7。我不太明白这是怎么发生的。??
7 << 4 == 0x70
0x70 | 0x02 == 0x72