2012-03-28 126 views
1

我在做一个简单的C++聊天,我想加密用一个简单的做代码的消息。 所以我认为它会像chars a-x,然后它会替换它们,例如-11。 因此,这将需要分割字符串转换成字符,然后返回字符串

  1. 斯普利特消息为字符
  2. 更改字符数为
  3. 将它们放回正确的顺序。

那么有谁知道该怎么做? 谢谢:)

+0

搜索在互联网上执行ROT加密的实现,在你的情况下它将是ROT-11。 ROT代表“旋转”,因为'''' - 11'会给你一个字符超大的字母。相反,该值应该等于“z'-10”。 ROT-13最常见,因为加密与解密相同。 – 2012-03-28 19:35:52

回答

1

std::string将存储任意值为char,并让您可以轻松访问个别字符。但是,对于加密,您可能更喜欢使用unsigned char,这很容易 - std::string只是std::basic_string<char>的typedef,但std::basic_string<unsigned char>非常易于管理。

这听起来像你想要的是一个Ceaser密码的顺序,尽管如果你只是“加密”所有东西,而不仅仅是字母,这是最容易的。

std::basic_string<unsigned char> s; 

for (int i=0; i<s.length(); i++) 
    s[i] += 5; 

再到“解密”你只是做相反:

for (int i=0; i<s.length; i++) 
    s[i] -= 5; 
0

在C++中的字符串已经是字符数组,除非你的聊天程序使用Unicode或其它字符集编码。在这种情况下,事情变得复杂得多,因为字符串可能是网络中新鲜的字节数组(不是字符),或者它可能是一组经过解码的宽字符(一个wstring)。

但假定您有一个8位字符的ASCII字符串或32位字符的解码宽字符串,步骤1和2非常容易。第一步是为你完成的。您应该可以使用数组索引访问每个字符,如mystring[1],mystring[2]。步骤2很容易,因为字符号码。只需要对角色值进行数学计算。你可以加,减,乘:无论你喜欢什么。请注意,8位字符的值可能在-128到+127之间。

字符的顺序串在不改变。所以把它们留在原地。

如果您的编码方法改变了字符串的长度,那么您将需要创建一个新的字符串副本。做这件事的最好方法就是在你做数学的时候。在C++中,使用push_back方法将新字符添加到新字符串的“后面”。

2

一个简单的方法是运行一个循环并在每次迭代中处理字符。

#include <iostream> 
#include <string.h> 

using namespace std;  

int main() {  

int num = 3; //your choice for encryption 
int len = 30; //length of string 
char * str = new char[len]; 
cin>>str; 

//encrypt 
for (int i = 0; i < strlen(str);i++) 
{ 
    str[i] += num; 
} 

cout<<str<<endl; 
return 0; 
}