字符与整数算术

时间:2018-03-16 23:12:59

标签: c math rsa

这与另一个问题有关,但我相信我已经找到了问题并且现在遇到了这个问题。似乎我可以在uint8_t上正确地进行算术运算,但不能在unsigned char上进行算术运算。我不确定为什么会这样,因为unsigned char应该等同于uint8_t对我的理解。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

/*

gcc -o ./rsacalc ./rsacalc.c
./rsacalc 1 2 3

should produce 00:00 but usually seems to produce 03:00

*/

int main(int argc, char **argv)
{
    unsigned char sg, sk, sm;
    uint8_t ng, nk, nm;
    if ( argc != 4 ) return 0;

    sg = argv[1][0];
    sk = argv[2][0];
    sm = argv[3][0];

    ng = atoi(argv[1]);
    nk = atoi(argv[2]);
    nm = atoi(argv[3]);

    printf("%.2X:%.2X\n",
        ((sg ^ sk) % sm),
        ((ng ^ nk) % nm)
    );
    return 0;
}

1 个答案:

答案 0 :(得分:3)

问题是这个

sg = argv[1][0];
sk = argv[2][0];
sm = argv[3][0];

在这里,您要分配'1'(49),'2'(50)和'3'(51)的ASCII codes。请注意'1' != 1。你正在做算术 不同的价值观,当然结果会有所不同。它无关 与类型。

正确的版本应为

sg = argv[1][0] - '0';
sk = argv[2][0] - '0';
sm = argv[3][0] - '0';