首先,我想说这个问题已经与此链接(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;”这显然不起作用操作
我怎样才能解决这个问题?
答案 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 int
和char
尺寸,int
中只有4或8个字符。
如果它小于这个你可以做:
int
(请注意,此处unsigned int res=0;
res |= string[0] << 24;
res |= string[1] << 16;
res |= string[2] << 8;
res |= string[3];
表示bitshift)
长话短说,你不能转换整个字符串,除非它真的很短。 但是当你想到它时,一个字符串已经是一个数字列表(代表字符)。请记住:数字始终为二进制,直到您将其打印为文本。