我正在尝试通过使用 C 中的 ASCII 字符操作来执行一种非常基本的加密和解密形式。我有以下代码:
char* myEncrypt(char* stringToEncrypt)
{
char *encryptedString = malloc(256);
strcpy(encryptedString, stringToEncrypt);
int publicKey = 50;
for (int i = 0; encryptedString[i] && encryptedString[i] != '\n'; ++i)
encryptedString[i] = (encryptedString[i] + publicKey) % 256;
return encryptedString;
}
我的问题是,当我运行这段代码时,我经常得到分配给 encryptedString[i] 的 ASCII 字符整数值的负值。这导致解密失败。查看代码,我应该无法获得负值,因为我使用的是模运算。我在这里遗漏了一些简单的东西吗?
最佳答案
许多实现使用带符号的字符作为普通 char
。如果您需要无符号字符,则需要使用 unsigned char
。
例如,如果 char
的值为 100,加上 50,就会得到 150。如果 CHAR_MAX
的值为 127(典型值),则结束将实现定义的值分配回您的角色——很可能环绕到 -106。
此外,在 C 中,负值在模运算后仍将是负值。例如:-50 % 256
就是 -50
。因此,如果您的原始字符串包含小于 -50 的字符,那么在加上 50 并取模 256 之后,您最终会得到负值。
关于c - 为什么我的 ASCII 整数值变成负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35422663/