У меня есть следующее вычисление 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, но это не так.