从String转换为Unsigned Long和back

时间:2011-06-16 06:00:33

标签: c++

如何将字符串转换为unsigned long,以便unsigned long将字符串中的字符表示为8位数字?

提前致谢。

编辑:我想要做的是将一个由4个字符组成的字符串转换为ASCII码格式的相同四个字符中的长字符。

2 个答案:

答案 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;
}

http://ideone.com/Cw7hF