gpt4 book ai didi

使用无符号字符的凯撒密码函数?

转载 作者:行者123 更新时间:2023-11-30 15:51:21 25 4
gpt4 key购买 nike

我正在研究凯撒函数,该函数给定输入和偏移量,返回输出。我不确定我是否正在这样做。我在这里做错了什么?任何帮助表示赞赏。另外,如果有人可以解释我如何使用无符号字符。

void encrypt(unsigned char* message_input, char off, unsigned char* message_output) {

int m_inp;

while(*(message_input+ m_inp)!=EOF)
{
*(message_output+ m_inp) = (*((unsigned char*)input + m_inp) + offset )%256;
}

}

最佳答案

代码存在许多正确性和风格问题。

正确性问题

  1. 循环变量 m_inp 未初始化。

  2. unsigned char 不可能等于 EOFEOF 的值为 -1。循环永远不会完成(除非您使用非常奇怪的架构)。

  3. 传统的凯撒密码按字母顺序运行,而不是按整个 ASCII 字符集运行。

风格问题

使用更多“风格正确”的 C 语言将使其他程序员更容易阅读您的代码。这些都是主观的。

  1. 名称m_inp对于短循环中的循环变量来说是一个糟糕的名称。请改用 i

  2. ptr[i]*(ptr + i) 更容易阅读,尽管它们在 C 中完全相同。

  3. 将输入标记为 const unsigned char * 可以更明显地表明它没有被修改。

  4. 使用 int 而不是 char 作为偏移量。

  5. 传统上,函数输出位于左侧,输入位于右侧。不过,这并不重要。

修改后的代码

这是一个示例修订版。它采用以 NUL 结尾的字符串,并将凯撒编码/解码版本写入输出缓冲区。这是我编写函数的方式,不一定是您编写的方式:

void caesar(char *output, const char *input, int shift)
{
int i;
for (i = 0; input[i]; i++) {
if (input[i] >= 'a' && input[i] <= 'z')
output[i] = (input[i] - 'a' + shift) % 26 + 'a';
else if (input[i] >= 'A' && input[i] <= 'Z')
output[i] = (input[i] - 'A' + shift) % 26 + 'A';
else
output[i] = input[i];
}
output[i] = '\0';
}

请注意,凯撒加密和解密实际上是相同的操作,只是移位值不同。因此,如果您使用移位 3 进行加密,则可以使用移位 -3(或等效的 23)进行解密。

另请注意,您可以将 unsigned char 替换为 char,反之亦然,一切都将完全相同(尽管您需要转换输入)。

关于使用无符号字符的凯撒密码函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15189991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com