使用c++将ASCII转换成十六进制的无符号int形式

Converting ASCII into hexadecimal in an unsigned int form using C++

本文关键字:无符号 int 形式 十六进制 c++ ASCII 转换 使用      更新时间:2023-10-16

首先我想说这个问题已经与这个链接有关(将ASCII字符串转换为十进制和十六进制表示),但由于我不能添加评论,我需要问一些与该线程上的答案相关的具体问题。

Jerry Coffin的代码适合我:

for (int i=0; i<your_string.size(); i++)
    std::cout << std::hex << (unsigned int)your_string[i] << " ";

但是我想做的是,而不是通过cout打印出来,我想把它存储在一个无符号int变量中,因为我需要把这个值传递给另一个函数

我的代码是这样的:

unsigned int Ascii2Hex(std::string sString2Convert)
{
  unsigned int uiHexVal;
  for (int i=0; i<sString2Convert.size(); i++)
  {
    uiHexVal << std::hex << (unsigned int)sString2Convert[i];
  }
  return (uiHexVal);
}

由于"<<"操作符,这显然不起作用。

我该如何解决这个问题?

为此存在实用函数,我相信您可以使用与上面实际模拟的语法类似的stringstreams。即便如此,总有一种快捷的方法:

template <typename T> // Use only unsigned types or risk overflow
T ASCII2hex (std::string str)
{
    T ret = 0;
    for (int i = 0; i < sizeof(T) && i < str.size(); ++i)
        ret += str[i] << (8 * i);
    return ret;
}

还有这个非常危险且技术上未定义的但仍然优雅且奇怪地引人注目的解决方案:

template <typename T> // yadda yadda unsigned
T ASCII2hex_UNSAFE_DONT_USE_THIS_FUNCTION (std::string str)
{
    return *(T*) str.data(); // Note: overrun if str.size() < sizeof(T)!!!!
}

Jerry Coffin的代码正在做什么,尽管强制转换为unsigned int,将char转换为字符串。但通常情况下,coutoperator<<只是想:"哦,char,这是一个字母,对吧……"所以它打印它所代表的字母。因此,为了将其打印为十六进制值,他首先将其强制转换为int类型。

话虽如此,这里有一个问题:代码将每个字符分别转换为unsigned int,然后打印它。但是你想把所有的字符放在一个unsigned int中。根据charint的大小,int只适合4或8个字符。如果小于这个值,可以这样做:

unsigned int res=0;
res |= string[0] << 24;
res |= string[1] << 16;
res |= string[2] <<  8;
res |= string[3];

(注意这里的<<表示位移)

长话短说,你不能转换整个字符串,除非它真的很短。但是,当您考虑它时,字符串已经是一个数字列表(表示字符)。记住:数字总是二进制的,直到你把它们打印成文本。