我试图通过对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
s。如果需要这些字符不带符号,则需要使用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/