为什么我的ASCII整数值变为负值?
我正在尝试通过使用C中ASCII字符的操作来进行非常基本的加密和解密。我有以下代码:为什么我的ASCII整数值变为负值?,c,encryption,ascii,C,Encryption,Ascii,我正在尝试通过使用C中ASCII字符的操作来进行非常基本的加密和解密。我有以下代码: char* myEncrypt(char* stringToEncrypt) { char *encryptedString = malloc(256); strcpy(encryptedString, stringToEncrypt); int publicKey = 50; for (int i = 0; encryptedString[i] && enc
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。如果需要对字符进行无符号处理,则需要使用无符号字符
例如,如果char
值为100,加上50,则得到150。如果CHAR\u MAX
的值是127(典型),那么您最终会得到一个实现定义的值,该值被分配回您的角色——很可能会换回-106
同样,在C中,一个负值在模运算后仍然是负值。例如:
-50%256
是-50
。因此,如果原始字符串中的字符小于-50,那么在加上50并取模256后,将得到负值。代码的其余部分在哪里?我在函数中看不到导致问题的任何内容。stringToEncrypt
的原始声明及其在传递给函数之前的内容似乎是一个可能的源(当然,除非stringToEncrypt
为空或不包含nul终止字符)。因为char
是在系统上签名的?为什么有%256
?ASCII只有128个代码单元(全部为0到127)。许多字符串加密算法实际上在字节数组上运行并返回字节数组,因为并不打算总是返回在任何字符编码中都有效的字符串。