使用c++将ASCII转换成十六进制的无符号int形式
Converting ASCII into hexadecimal in an unsigned int form using C++
首先我想说这个问题已经与这个链接有关(将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转换为字符串。但通常情况下,cout
的operator<<
只是想:"哦,char,这是一个字母,对吧……"所以它打印它所代表的字母。因此,为了将其打印为十六进制值,他首先将其强制转换为int类型。
话虽如此,这里有一个问题:代码将每个字符分别转换为unsigned int
,然后打印它。但是你想把所有的字符放在一个unsigned int
中。根据char
和int
的大小,int
只适合4或8个字符。如果小于这个值,可以这样做:
unsigned int res=0;
res |= string[0] << 24;
res |= string[1] << 16;
res |= string[2] << 8;
res |= string[3];
(注意这里的<<
表示位移)
长话短说,你不能转换整个字符串,除非它真的很短。但是,当您考虑它时,字符串已经是一个数字列表(表示字符)。记住:数字总是二进制的,直到你把它们打印成文本。
相关文章:
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- 为什么QByteArray的大小是"int"而不是"无符号int"
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 使用无符号int作为二进制来在c++中实现一个集
- C++如何将变量传递给带有无符号 int & 的参数uint16_t函数?
- 为什么我不能使用在 Visual C++ 32 位中实现运算符无符号 int() 作为数组索引的类?
- 视觉C++转换和写入值为 10 的无符号 int 给出 5 个字节
- uint8_t在转换为无符号 int 时未打印正确的值
- G++ 错误:重载的"abs(无符号 int)"的调用不明确
- 将 3D 矢量浮点打包到无符号 int 中并将其解压缩
- 如何使用 JNI 将 double 和无符号 int 从本机 c 库返回到 java
- 为什么printf和cout为此无符号int提供了不同的输出
- memcpy 从无符号字符 * 到无符号 int
- C++ 重载与有符号和无符号 int 不同
- 创建具有未定义溢出的无符号 int
- 将大双精度转换为无符号 int 期间堆栈损坏
- 错误:成员引用基类型"uint32_t"(也称为"无符号 INT")不是结构或联合
- 无符号int的比较始终是正确的(NPOS问题?)