为什么我的代码不返回原始消息?
Why isn't my code returning the original message?
这是我的作业 link:
用户输入和加密很容易,但我似乎无法解密加密。工作是输入一个字母,往前走十个字母(加密),再往回走十个字母(解密。
我试过弄乱 for 循环,但我没有真正工作。
#include <iostream>
using namespace std;
int main()
{
char m; //Declare character
cin >> m; // Input Character
int ma = (int)m; // Convert character to integer
int c; // Declare ciphertext
for (int i=0; i<=10; i++) {
c = ma + i;
if (c > 122) {
c = 97;
}
}
char cc = char(c);
cout << " " << endl;
cout << "You ciphertext is:" << endl;
cout << cc << endl;
int cb = (int)cc;
//cb = cb - 10;
int nm;
for (int b = 0; b>=10; b++) {
nm = cb - b;
if (nm < 97) {
nm = 122;
}
}
char mb = (char)nm;
cout << "You message is" << endl;
cout << mb << endl;
}
所以这就是我所期望的:当我输入 "a" 时,密文应该是 "k" 并且解密的消息应该是 "a".
您的 "decryption" 循环永远不会执行:
for (int b = 0; b>=10; b++) {
这个for循环说:从b
= 0开始,然后循环,只要它大于10。嗯,0不大于10,所以不循环。
要撤消第一个循环,您可能需要这样做:
for (int b = 0; b<=10; b++) {
顺便说一下,循环只是重复相同的操作 10 次,所以你可以放弃循环:
int OFFSET = 10;
int LOWER_LIMIT = (int)'a';
int UPPER_LIMIT = (int)'z';
int RANGE_LENGTH = UPPER_LIMIT - LOWER_LIMIT + 1;
// encrypt
c = ma + OFFSET;
if (c > UPPER_LIMIT) {
c -= RANGE_LENGTH;
}
// decrypt
nm = cb - OFFSET;
if (nm < LOWER_LIMIT) {
nm += RANGE_LENGTH;
}
这是另一种解决方案。当您检查字符的 ascii 是否大于 122 时,您还必须进行一些数学运算。你不能只说
if (c > 122) {
c = 97;
}
因为所有最后 10 个字符都将转换为 "a"。
我认为 encrypt/decrypt 单个字符的更优雅的方式如下:
int main() {
char c; //Declare character
cin >> c; // Input Character
int ciphertext = c + 10;
if (ciphertext > 122)
ciphertext = ciphertext - 123 + 97;
cout << "You ciphertext is:" << (char)ciphertext << endl;
int deciphertext = ciphertext - 10;
if (deciphertext < 97)
deciphertext = 123 - (97 - deciphertext);
cout << "You original is:" << (char)deciphertext << endl;
}
注意,如果char的ascii值超过上限则从字母"a"开始计数。
正如我在评论中所说
for (int i=0; i<=10; i++) {
c = ma + i;
if (c > 122) {
c = 97;
}
}
会
{
int i = 10;
c = ma + i;
if (c > 122) {
c = 97;
}
}
因为 c 被重新分配所以前一回合对当前没有影响,只有最后一回合才算。
还有
for (int b = 0; b>=10; b++) {
nm = cb - b;
if (nm < 97) {
nm = 122;
}
}
什么都不做,因为测试 b>=10
立即为假 b 赋值为 0
独立于这些错误,所使用的编码对于很多值都是不可恢复的,并且对要编码的字符没有限制,它可以具有 char[=46= 支持的任何代码].
编码和解码的一种简单方法是对给定值进行异或运算,对于给定的 Y X ((X^Y)^Y) == X)
,所以编码和解码的方式相同,只是在两种情况下都做 ^Y
。
另一种可逆的方式是在一个方向上滚动进行编码,然后在相反方向上进行解码。警告滚动,而不是转向不松散位。
另一种方法是编码交换一些位(例如,低 4 位和高 4 位,假设 char 至少为 8 位),然后执行同样解码。
当然,您可以混合使用这些方式,而不是只使用其中一种方式。
当然你可以使用不基于公式的方法,例如为每个字母决定另一个字母来替换它(a -> Z,b -> 0 等,反之解码)
有无数种方法可以encode/decode
这是我的作业 link:
用户输入和加密很容易,但我似乎无法解密加密。工作是输入一个字母,往前走十个字母(加密),再往回走十个字母(解密。
我试过弄乱 for 循环,但我没有真正工作。
#include <iostream>
using namespace std;
int main()
{
char m; //Declare character
cin >> m; // Input Character
int ma = (int)m; // Convert character to integer
int c; // Declare ciphertext
for (int i=0; i<=10; i++) {
c = ma + i;
if (c > 122) {
c = 97;
}
}
char cc = char(c);
cout << " " << endl;
cout << "You ciphertext is:" << endl;
cout << cc << endl;
int cb = (int)cc;
//cb = cb - 10;
int nm;
for (int b = 0; b>=10; b++) {
nm = cb - b;
if (nm < 97) {
nm = 122;
}
}
char mb = (char)nm;
cout << "You message is" << endl;
cout << mb << endl;
}
所以这就是我所期望的:当我输入 "a" 时,密文应该是 "k" 并且解密的消息应该是 "a".
您的 "decryption" 循环永远不会执行:
for (int b = 0; b>=10; b++) {
这个for循环说:从b
= 0开始,然后循环,只要它大于10。嗯,0不大于10,所以不循环。
要撤消第一个循环,您可能需要这样做:
for (int b = 0; b<=10; b++) {
顺便说一下,循环只是重复相同的操作 10 次,所以你可以放弃循环:
int OFFSET = 10;
int LOWER_LIMIT = (int)'a';
int UPPER_LIMIT = (int)'z';
int RANGE_LENGTH = UPPER_LIMIT - LOWER_LIMIT + 1;
// encrypt
c = ma + OFFSET;
if (c > UPPER_LIMIT) {
c -= RANGE_LENGTH;
}
// decrypt
nm = cb - OFFSET;
if (nm < LOWER_LIMIT) {
nm += RANGE_LENGTH;
}
这是另一种解决方案。当您检查字符的 ascii 是否大于 122 时,您还必须进行一些数学运算。你不能只说
if (c > 122) {
c = 97;
}
因为所有最后 10 个字符都将转换为 "a"。
我认为 encrypt/decrypt 单个字符的更优雅的方式如下:
int main() {
char c; //Declare character
cin >> c; // Input Character
int ciphertext = c + 10;
if (ciphertext > 122)
ciphertext = ciphertext - 123 + 97;
cout << "You ciphertext is:" << (char)ciphertext << endl;
int deciphertext = ciphertext - 10;
if (deciphertext < 97)
deciphertext = 123 - (97 - deciphertext);
cout << "You original is:" << (char)deciphertext << endl;
}
注意,如果char的ascii值超过上限则从字母"a"开始计数。
正如我在评论中所说
for (int i=0; i<=10; i++) {
c = ma + i;
if (c > 122) {
c = 97;
}
}
会
{
int i = 10;
c = ma + i;
if (c > 122) {
c = 97;
}
}
因为 c 被重新分配所以前一回合对当前没有影响,只有最后一回合才算。
还有
for (int b = 0; b>=10; b++) {
nm = cb - b;
if (nm < 97) {
nm = 122;
}
}
什么都不做,因为测试 b>=10
立即为假 b 赋值为 0
独立于这些错误,所使用的编码对于很多值都是不可恢复的,并且对要编码的字符没有限制,它可以具有 char[=46= 支持的任何代码].
编码和解码的一种简单方法是对给定值进行异或运算,对于给定的 Y X ((X^Y)^Y) == X)
,所以编码和解码的方式相同,只是在两种情况下都做 ^Y
。
另一种可逆的方式是在一个方向上滚动进行编码,然后在相反方向上进行解码。警告滚动,而不是转向不松散位。
另一种方法是编码交换一些位(例如,低 4 位和高 4 位,假设 char 至少为 8 位),然后执行同样解码。
当然,您可以混合使用这些方式,而不是只使用其中一种方式。
当然你可以使用不基于公式的方法,例如为每个字母决定另一个字母来替换它(a -> Z,b -> 0 等,反之解码)
有无数种方法可以encode/decode