Преобразовать вычисление c ++ crc16 с полиномом в android java - PullRequest
0 голосов
/ 11 марта 2020

У меня есть следующее вычисление c ++ crc16 "U16 Crc16". Я пробовал каждый пример, чтобы преобразовать это в android Java. Ничего не сработало.

#define POLYNOM16 0xAC5E //  1.X15 + 0.X14 + 1.X13 + 0.X12 1010 A
                         //+ 1.X11 + 1.X10 + 0.X09 + 0.X08 1100 C
                         //+ 0.X07 + 1.X06 + 0.X05 + 1.X04 0101 5
                         //+ 1.X03 + 1.X02 + 1.X01 + 0.X00 1110 E
U16 Crc16(const void* data, S16 sizeofData)
{
    U16 Crc      = 0xFFFF;
    U16 ByteCnt = 0;
    U8 BitCnt   = 0;
    U16 Parity  = 0;
    if (sizeofData <= 0 || data == NULL) return 0;
    U8* ptr = (U8*)data;
    for ( ByteCnt = 0 ; ByteCnt < sizeofData ; ByteCnt ++)
    {
        Crc ^= *( ptr + ByteCnt);
        if( Crc == 0 ) Crc = 1;
        for ( BitCnt = 0; BitCnt <= 7 ; BitCnt ++)
        {
            Parity = Crc;
            Crc >>= 1;
            if ((Parity & 1) !=0 ) Crc ^= POLYNOM16;
        }
    }
    return(Crc);
}

Вот моя последняя попытка java преобразования в двух функциях.

 public static int crc16_update(int crc, byte a,int poly)
{
    crc ^= ((a+128) & 0xff);
    for (int i = 0;  i < 8; ++i) {
        if ((crc & 1) != 0) {
            crc = ((crc >>> 1) ^ /*0xA001*/poly) & 0xffff;
        }
        else {
            crc = (crc >>> 1) & 0xffff;
        }
    }
    return crc;
}
public static byte[] crc16Miron(byte[] bytes, int poly)
{
    int crc = 0;
    for (byte b : bytes) {
        crc = crc16_update(crc, b, poly);
    }
    return new byte[]{(byte)(crc & 0x00FF),(byte)((crc & 0xFF00)>>8)};
    //org return (short) crc;
}

Вот шестнадцатеричная строка данных байтов, последние два последних байта "хорошие" crc16. 373237393130000000000000000000004e4f4d3030343533372d430000000000303030313146000000000000000000000b060000010001012d6678025b437e0008b7e5, где b7e5 - это "хорошее" cr * 16 * 101 * 101 * 101 373237393130000000000000000000004e4f4d3030343533372d430000000000303030313146000000000000000000000b060000010001012d6678025b437e0008

Итак. если вы передаете вторую шестнадцатеричную строку как байт [], она должна вычислить b7e5, но это не так.

...