펌웨어 업데이트를 위해 CRC16 체크섬을 만들어야합니다. I이 데이터를 전송하면 상기 제어기부호없는 int없이 CRC16 함수를 C에서 JAVA로 변환 할 때의 문제
-17514
에서
020000810000120000000002F001128100000C9462050C9481050C9481050C9481050C9481050C9481050C9481050C9481050C9481050C9481050C9481050C94
I는 다음 얻을 CRC16를 (바이트 []로 헥스 문자열로부터 변환) 지금 자바에서 이것을 확인하려고 노력하지만, 나는 동일한 가치를 얻지 못한다.
static uint16_t crc16_update(uint16_t crc, uint8_t a)
{
crc ^= a;
for (unsigned i = 0; i < 8; ++i) {
if (crc & 1)
crc = (crc >> 1)^0xA001;
else
crc = (crc >> 1);
}
return crc;
}
static uint16_t crc16(const uint8_t *b, size_t l)
{
uint16_t crc = 0;
while (l-- > 0)
crc = crc16_update(crc, *b++);
return crc;
}
이 자바에서 내 변환 된 기능은 다음과 같습니다 :
이
는 C에서 원래의 함수입니다public static int crc16_update(int crc, int a) {
crc ^= a;
for (int i = 0; i < 8; ++i) {
if ((crc & 1) != 0) {
crc = (crc >> 1)^0xA001;
} else {
crc = (crc << 1);
}
}
return crc;
}
public static int crc16(byte[] bytes) {
int crc = 0;
for (byte b:bytes) {
crc = crc16_update(crc, b);
}
return crc;
}
...하지만 그것은 작동하지 않습니다. 그게 뭐가 잘못 됐어?
일곱 번째 줄을보십시오. 원본 : '(crc >> 1)'귀하의 코드 : '(crc << 1). 그러나 문제를 해결했는지는 모르겠지만 ... – looper
부호없는 결과를 계산하는 루틴에서 음수 -17514를 얻는 것이 조금 이상한 것이 아닌가? 혹시 당신의 자바 루틴이 대신 '48022'를 반환합니까? – dasblinkenlight
괜찮습니다. 나는 그것을 chagned했습니다. –