使用C ++将ASCII转换为无符号整数形式的十六进制

时间:2015-07-12 03:06:49

标签: c++ ascii

首先,我想说这个问题已经与此链接(Convert ASCII string into Decimal and Hexadecimal Representations)有关,但由于我无法添加评论,因此我需要询问与该帖子的答案相关的具体内容。 / p>

Jerry Coffin的代码对我有用:

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

但我想做的不是通过cout打印出来,而是想将它存储在unsigned 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);
}

由于“&lt;&lt;”这显然不起作用操作

我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

实用程序函数存在于此,我相信您可以使用与您上面实际模拟的语法类似的字符串流。即便如此,总有一种快速而又肮脏的方式:

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)!!!!
}

答案 1 :(得分:1)

Jerry Coffin的代码正在做什么,尽管转换为unsigned int,正在将char转换为字符串。但通常情况下,operator<<的{​​{1}}只是认为:&#34;哦,char,这是一封正确的字母......&#34;所以它将它打印为它所代表的字母。因此,要将其打印为十六进制值,他首先将其转换为int。

话虽如此,问题在于:代码将每个字符分别转换为cout,然后打印出来。但是您想将所有字符放在一个unsigned int中。根据您的unsigned intchar尺寸,int中只有4或8个字符。 如果它小于这个你可以做:

int

(请注意,此处unsigned int res=0; res |= string[0] << 24; res |= string[1] << 16; res |= string[2] << 8; res |= string[3]; 表示bitshift)

长话短说,你不能转换整个字符串,除非它真的很短。 但是当你想到它时,一个字符串已经是一个数字列表(代表字符)。请记住:数字始终为二进制,直到您将其打印为文本。