0

按照这些步骤,我编写了函数来检查我扫描的标签的值是否正确,但它总是返回 false。这是我的功能:

int checksum(const char* string)
{
    int i;
    char hexPairs[6][2];
    long totXor;

    // load matrix
    for(i=0; i<6; i++)
    {
        hexPairs[i][0] = string[i*2];
        hexPairs[i][1] = string[i*2+1];
    }

    // perform xor
    totXor = strtol(hexPairs[0], NULL, 16);
    for(i=1; i<5; i++)
    {
        totXor = totXor^strtol(hexPairs[i], NULL, 16);
    }

    return (totXor == strtol(hexPairs[5], NULL, 16));
}

我究竟做错了什么?

我已经手动完成了二进制值的异或,以检查我扫描的值是否有效。

已编辑

上面的代码不起作用,因为它在每对的末尾没有'\0'。解决了这个问题,我的代码在 CodeBlocks 中工作,但在我需要它工作的 Vinculum II IDE 中,总是返回 false。这是我尝试过的版本列表:

int checksum(const char* string)
{
    int i;
    char hexPairs[6][3];
    long totXor = 0;

    // load matrix
    for(i=0; i<6; i++)
    {
        hexPairs[i][0] = string[i*2];
        hexPairs[i][1] = string[i*2+1];
        hexPairs[i][2] = '\0';
    }

    // perform xor
    totXor = strtol(hexPairs[0], NULL, 16);
    for(i=1; i<5; i++)
    {
        totXor = totXor^strtol(hexPairs[i], NULL, 16);
    }

    return (totXor == strtol(hexPairs[5], NULL, 16));
}


int checksum(const char* string)
{
    int i;
    char *hexPairs[6];
    long totXor = 0, chk = 0;

    // load matrix
    for(i=0; i<6; i++)
    {
        hexPairs[i] = malloc(3);
        memset(hexPairs[i], 0, 3);
        hexPairs[i][0] = string[i*2];
        hexPairs[i][1] = string[i*2+1];
    }

    // perform xor
    totXor = strtol(hexPairs[0], NULL, 16);
    for(i=1; i<5; i++)
    {
        totXor = totXor^strtol(hexPairs[i], NULL, 16);
    }

    chk = strtol(hexPairs[5], NULL, 16);

    return (totXor == chk);
}


int checksum(const char* string)
{
    char *hex0, *hex1, *hex2, *hex3, *hex4, *hexChk;
    long totXor = 0, chk = 0;

    hex0 = malloc(3);
    hex1 = malloc(3);
    hex2 = malloc(3);
    hex3 = malloc(3);
    hex4 = malloc(3);
    hexChk = malloc(3);

    memset(hex0, 0, 3);
    memset(hex1, 0, 3);
    memset(hex2, 0, 3);
    memset(hex3, 0, 3);
    memset(hex4, 0, 3);
    memset(hexChk, 0, 3);

    hex0[0] = string[0];
    hex0[1] = string[1];

    hex1[0] = string[2];
    hex1[1] = string[3];

    hex2[0] = string[4];
    hex2[1] = string[5];

    hex3[0] = string[6];
    hex3[1] = string[7];

    hex4[0] = string[8];
    hex4[1] = string[9];

    hexChk[0] = string[10];
    hexChk[1] = string[11];

    // perform xor
    totXor = strtol(hex0, NULL, 16);
    totXor = totXor^strtol(hex1, NULL, 16);
    totXor = totXor^strtol(hex2, NULL, 16);
    totXor = totXor^strtol(hex3, NULL, 16);
    totXor = totXor^strtol(hex4, NULL, 16);

    chk = strtol(hexChk, NULL, 16);

    return (totXor == chk);
}

int checksum(const char* string)
{
    char *hex0, *hex1, *hex2, *hex3, *hex4, *hexChk;
    long totXor = 0, chk = 0;

    hex0 = malloc(3);
    hex1 = malloc(3);
    hex2 = malloc(3);
    hex3 = malloc(3);
    hex4 = malloc(3);
    hexChk = malloc(3);

    memset(hex0, 0, 3);
    memset(hex1, 0, 3);
    memset(hex2, 0, 3);
    memset(hex3, 0, 3);
    memset(hex4, 0, 3);
    memset(hexChk, 0, 3);

    sprintf(hex0, "%c%c", string[0], string[1]);
    sprintf(hex1, "%c%c", string[2], string[3]);
    sprintf(hex2, "%c%c", string[4], string[5]);
    sprintf(hex3, "%c%c", string[6], string[7]);
    sprintf(hex4, "%c%c", string[8], string[9]);

    sprintf(hexChk, "%c%c", string[10], string[11]);

    // perform xor
    totXor = strtol(hex0, NULL, 16);
    totXor = totXor^strtol(hex1, NULL, 16);
    totXor = totXor^strtol(hex2, NULL, 16);
    totXor = totXor^strtol(hex3, NULL, 16);
    totXor = totXor^strtol(hex4, NULL, 16);

    chk = strtol(hexChk, NULL, 16);

    return (totXor == chk);
}

我这样调用函数:

if(!checksum("6D003D302040"))
{
    return;
}
4

1 回答 1

0

解决了

我终于可以让它改变回报。这是最终的功能:

int checksum(const char* string)
{
    int i;
    char *hexPairs[6];
    long totXor = 0;

    // load matrix
    for(i=0; i<6; i++)
    {
        hexPairs[i] = malloc(3);
        memset(hexPairs[i], 0, 3);
        hexPairs[i][0] = string[i*2];
        hexPairs[i][1] = string[i*2+1];
    }

    // perform xor
    totXor = strtol(hexPairs[0], NULL, 16);
    for(i=1; i<5; i++)
    {
        totXor = totXor^strtol(hexPairs[i], NULL, 16);
    }

    return ((totXor == strtol(hexPairs[5], NULL, 16)) ? 1 : 0);
}

Vinculum 似乎不喜欢“return (totXor == strtol(hexPairs[5], NULL, 16));”。

它不喜欢矩阵“char hexPairs[6][3];” 任何一个。

于 2014-07-16T13:03:20.670 回答