C:如何将字符添加到字符,并在达到最大字符时循环回 'a' ?

标签 c char

我正在创建一个简单的加密程序。 我将字符添加到字符以创建新字符。

到目前为止,新的“char”通常由“?”表示。

我的假设是 char 变量有一个最大和,一旦它被传递,它就会循环回 0。

假设逻辑:

如果字符 a == 1 && 字符 z == 255 那么 256 应该 == a。

事实似乎并非如此。

<小时/>

此代码片段将一个字符添加到一个字符。 它经常打印出类似的内容:

for (int i = 0; i < half; ++i) {
    halfM1[i] = halfM1[i] + halfP1[i];
    halfM2[i] = halfM2[i] + halfP2[(half + i)];
}

printf("\n%s\n", halfM1 );
printf("%s\n", halfM2);

返回:

a???

3d??
<小时/>

此代码片段删除了添加的字符,字符串恢复正常。

for (int i = 0; i < half; ++i) {
    halfM1[i] = halfM1[i] - halfP1[i];
    halfM2[i] = halfM2[i] - halfP2[(half + i)];
}

printf("\n%s\n", halfM1 );
printf("%s\n", halfM2);

返回:

messagepart1
messagepart2
<小时/>

代码在技术上是有效的,但我希望加密以字符为单位。

如果质疑为什么“一半”无处不在。 消息和 key 被分成两半,因此消息的前半部分和后半部分有单独的加密。

最佳答案

首先,常见的char不存在“环绕”这样的东西。 。常见char是 x86 中的有符号类型,有符号整数没有环绕。相反,溢出会导致未定义的行为。此外,char的范围s 可以是 -128 ... 127,甚至是其他值

出于加密目的,您需要使用无符号字符,或者更好的是,使用 uint8_t 的原始八位字节(<stdint.h>)。

第二个问题是您使用 %s 进行打印。可能的 256 个结果字符之一是 \0 。如果它进入结果字符串,它将提前终止该字符串。而不是使用 %s ,你应该用 fwrite(halfM1, buffer_size, 1, stdout) 输出它。当然,问题是输出仍然是一些二进制垃圾。为此,许多 Unix 加密程序将写入文件,或者可以选择输出 ASCII-armoured file 。一个简单的 ASCII 装甲将输出为 hex instead of binary.

第三个是,有一种操作比加密目的的加法/减法要好得多:XOR ,或halfM1[i] = halfM1[i] ^ halfP1[i]; - 其美妙之处在于它是它自己的逆!

关于C:如何将字符添加到字符,并在达到最大字符时循环回 'a' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54758874/

相关文章:

编译GLFW找不到-lglfw3

使用 lcov 源文件的代码覆盖率

char数组中的C++ Num到int

c - 对于非常大的整数值,我们如何将字符串转换为 int?

c - 在 C 中发送 bash connectback 问题

c - 释放线程获取的资源

c - C 中通过函数计算数组大小

char 或 float 溢出

java - 如何按顺序统计字符串中的字符?

c++ - 将字符串拆分为字符,然后返回字符串