Tôi hiện đang làm việc trên một dự án, có một hệ thống nhúng gửi dữ liệu đến PC qua radio. Các gói nhận được một checksum crc16 ở cuối và nó được tính toán dựa trên thuật toán này:Chuyển đổi C CRC16 sang Java CRC16
uint16_t crc16 (const uint8_t * buffer, uint32_t size) {
uint16_t crc = 0xFFFF;
if (buffer && size)
while (size--)
{
crc = (crc >> 8) | (crc << 8);
crc ^= *buffer++;
crc ^= ((unsigned char) crc) >> 4;
crc ^= crc << 12;
crc ^= (crc & 0xFF) << 5;
}
return crc;
}
Bây giờ tôi đang tìm kiếm một tương đương trong Java. Tôi đã tìm thấy một trong những tốt ở đây: http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html
public class CRC16CCITT {
public static void main(String[] args) {
int crc = 0xFFFF; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
// byte[] testBytes = "123456789".getBytes("ASCII");
byte[] bytes = args[0].getBytes();
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15^bit) crc ^= polynomial;
}
}
crc &= 0xffff;
System.out.println("CRC16-CCITT = " + Integer.toHexString(crc));
}
}
Nhưng công việc doesnt này với Mã C của tôi.
Có ai có thể cung cấp khả năng thích ứng hoặc giải pháp cho thuật toán tương đương C và Java không? Cảm ơn bạn!
Tại sao các bạn cách thiết lập 'crc = 'trên mỗi iteration vì đây là giống như bỏ qua tất cả các giá trị nhưng cuối cùng. –
Vậy tôi phải viết gì? crc^=? Tôi vừa sao chép mã từ một dự án mã nguồn mở mà tôi đã làm việc cùng. – tellob
Có nhiều cách để tính toán CRcs nhanh hơn nhiều. Tiếp tục tìm kiếm. Có một phương pháp điều khiển bảng. – EJP