如何将字符串转换为unsigned long,以便unsigned long将字符串中的字符表示为8位数字?
提前致谢。
编辑:我想要做的是将一个由4个字符组成的字符串转换为ASCII码格式的相同四个字符中的长字符。
答案 0 :(得分:1)
假设“str”是字符串(std :: string),而“res”是要写入的unsigned long。 像这样:
for (std::string::iterator i = str.begin(); i != str.end(); ++i) {
res <<= 8;
res += *i;
}
但它只适用于不超过4个字符的字符串(假设无符号长度为32位宽,如果为64位则为8个字符)
它会将第一个字符放入unsigned long的最重要字节,如果你想要反过来,你可以使用rbegin,rend。
编辑: res
必须分配给自己,否则结果会丢失。
答案 1 :(得分:1)
大致相同的解决方案,对整数类型大小做出较少的假设,并检查可以这种方式转换的最大字符串大小:
#include <string>
#include <algorithm>
#include <iostream>
#include <climits>
int main()
{
const size_t MAX = sizeof(unsigned long);
std::string s("abcd");
unsigned long res = 0;
for (size_t i=0; i < std::min(MAX, s.size()); ++i)
{
res <<= CHAR_BIT;
res += (unsigned char) s[i];
}
std::cout << std::hex << res;
}
打印
61626364
转换为unsigned char
的情况是您的字符串包含高位ASCII,即高于127的值,在这种情况下char
将为负数。请尝试使用字符串"\226\226\226\226"
,否则会得到错误的结果)
编辑:顺便说一句,在你的主题中你说“然后回来”,所以这是反向转换:
#include <limits>
std::string tostr(unsigned long x)
{
// this will mask out the lower "byte" of the number
const unsigned long mask = std::numeric_limits<unsigned char>::max();
if (x == 0)
return std::string("0");
std::string res;
for (; x > 0; x >>= CHAR_BIT) {
res += (char) (x & mask);
}
// we extracted the bytes from right to left, so need to reverse the result
std::reverse(res.begin(), res.end());
return res;
}