我不知道我是否有正确的倾斜,所以如果我错了请纠正我,我会改变我的头衔。
我有一个字符串,对于这个例子,我将使用:
"8ce4b16b"
我想将位(我认为)沿1移位,因此字符串将是:
"9df5c27c"
任何想法?
编辑:
您知道,这些字符串是十六进制的。所以它永远不会到达z。 我想做的就是在数字上加一个数字,然后在字母表中一步一步,这样a-> b,f-> g ect ect
如果数字为9,则会有条件将其保持为9。
输出不需要是十六进制。
此外,字符串只是一个例子。它是MD5加密的一部分。
答案 0 :(得分:6)
转换string
?这听起来像是std::transform()
的工作:
#include <cassert>
#include <string>
char increment(char c)
{
if ('9' == c)
{
return '9';
}
return ++c;
}
std::string increment_string(const std::string& in)
{
std::string out;
std::transform(in.begin(), in.end(), std::back_inserter(out), increment);
return out;
}
int main()
{
assert(increment_string("8ce4b16b") == "9df5c27c");
assert(increment_string("ffffffff") == "gggggggg");
assert(increment_string("89898989") == "99999999"); // N.B: this is one of 2^8 strings that will return "99999999"
assert(increment_string("99999999") == "99999999"); // This is one more. Mapping backwards is going to be tricky!
return 1;
}
您希望对字符施加的任何限制都可以在increment()
函数中实现,如图所示。
另一方面,如果您希望将字符串视为十六进制数字并将0x11111111
添加到其中:
#include <sstream>
#include <cassert>
int main()
{
std::istringstream iss("8ce4b16b");
long int i;
iss >> std::hex >> i;
i += 0x11111111;
std::ostringstream oss;
oss << std::hex << i;
assert(oss.str() == "9df5c27c");
return 1;
}
在string
的构造中没有移位。
答案 1 :(得分:2)
看起来你只是将0x11111111添加到整数。但是你能准确指出你的输入有什么?当你将一个添加到“f”或“9”时,结果应该是什么?
答案 2 :(得分:1)
这不是移位位...移位一位将字值乘以2.您只需将每个十六进制值递增1,这可以通过将0x11111111
添加到您的双字来完成。
例如,如果你取了你的值0x8ce4b16b
(将上面打印的值视为 - 如果它们是十六进制的4字节双字),将它移动一位,你会最终得到0x19C962D6
。
但是如果你只是想增加你的dword的每个半字节(十六进制数中的每个单独的值代表4位或半字节),你将不得不为每个半字节添加一个0x1的偏移量。此外,十六进制字中没有G
的值...您的值为0->9
,然后是A->F
,其中F
表示基数为10的值15最后,当您将0x1
添加到0xF
时,您将回到0x0
。
答案 3 :(得分:0)
你的意思是你想增加字符串中的每个字符吗? 您可以通过数组迭代并为每个字符添加一个。