c - 为什么我的 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] && 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/

相关文章:

c - 将 va_list 传递给多个函数而不调用 va_arg

c - 你知道为什么这个 C 代码以 "segmentation fault"结尾吗?

c - 使用字符串作为函数的参数

java - Blowfish 加密问题

c - 链表段错误

c# - 我的 MVC3 密码处理是否足够

java - android中的解密 key 等 secret 数据在哪里存储,这样黑客就永远找不到

ascii - Hexdump 的最佳 OCR

c# - 是否有可能写入或打印到控制台

c - 我如何将二进制转换为 ASCII