我试图通过对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字符的整数值的负值。这导致解密失败。查看代码,因为我使用模运算,所以我无法获得负值。我在这里错过了一些简单的东西吗?
答案 0 :(得分:1)
许多实现使用普通char
的签名字符。如果您需要将字符设为无符号,则您需要使用unsigned char
。
例如,如果您的char
值为100,并且您添加了50,那么您将获得150.如果CHAR_MAX
值为127(典型值),那么您最终会得到一个实现定义值被分配回你的角色 - 最有可能回到-106。
此外,在C中,模数运算后负值仍为负值。例如:-50 % 256
为-50
。因此,如果您的原始字符串的字符小于-50,则在添加50并使用模256后,最终会得到负值。