如何检查RFID标签的校验和

时间:2014-07-15 11:44:24

标签: c hex checksum rfid bitwise-xor

关注this steps我写了我的函数来检查我扫描的标签的值是否正确,但它总是返回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));
}

我做错了什么?

我手动完成了二进制值的xor,以检查我扫描的是有效值。

EDITED

上面的代码不起作用,因为它在每对的末尾都没有'\ 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;
}

1 个答案:

答案 0 :(得分: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不喜欢&#34; return(totXor == strtol(hexPairs [5],NULL,16));&#34;。

它不喜欢矩阵&#34; char hexPairs [6] [3];&#34;任