2012-09-11 59 views
5

Tôi đang gặp vấn đề với việc tính toán CRC-16 thực hiện một mảng byte trong java. Về cơ bản tôi đang cố gắng gửi byte đến một RFID bắt đầu viết vào một thẻ. Tôi có thể thấy giá trị checksum của mảng bằng cách tìm lệnh tcpdump trên mac. Nhưng mục tiêu của tôi là tạo ra nó một mình. Đây là mảng byte của tôi nên tạo 0xbe, 0xd9:crc16 thực hiện java

byte[] bytes = new byte[]{(byte) 0x55,(byte) 0x08,(byte) 0x68, (byte) 0x14, 
          (byte) 0x93, (byte) 0x01, (byte) 0x00, (byte) 0x00, 
          (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06, 
          (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, 
          (byte) 0x13, (byte) 0x50, (byte) 0x00, (byte) 0x00, 
          (byte) 0x00, (byte) 0x22, (byte) 0x09, (byte) 0x11}; 

0x55 là tiêu đề. Theo tài liệu nói rằng nó sẽ bị loại trừ.

Bất cứ khi nào tôi thử mảng này trên java (với 0xbe, 0xd9), RFID hoạt động. Vấn đề của tôi là tạo ra các giá trị tổng kiểm tra đó. Tôi đã tìm kiếm gần như toàn bộ trang web nhưng không có cơ hội. Tôi không thể tìm thấy bất kỳ thuật toán nào tạo ra 0xbe, 0xd9.

Bất kỳ ý tưởng nào được chào đón nhiều nhất đối với tôi. Cảm ơn trước.

chỉnh sửa: here is the protocol rằng cung cấp RFID

Trả lời

2

Tôi không thực sự chắc chắn nếu điều này là bản dịch đúng trong Java của C thuật toán crc16 .... nhưng nó cho thấy kết quả chính xác cho ví dụ của bạn!

Vui lòng so sánh các kết quả khác với CRC16 của Mac và kiểm tra căng thẳng nó trước khi sử dụng.

public class Crc16 { 
public static void main(String... a) { 
    byte[] bytes = new byte[] { (byte) 0x08, (byte) 0x68, (byte) 0x14, (byte) 0x93, (byte) 0x01, (byte) 0x00, 
      (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x00, (byte) 0x01, 
      (byte) 0x00, (byte) 0x13, (byte) 0x50, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x22, (byte) 0x09, 
      (byte) 0x11 }; 
    byte[] byteStr = new byte[4]; 
    Integer crcRes = new Crc16().calculate_crc(bytes); 
    System.out.println(Integer.toHexString(crcRes)); 

    byteStr[0] = (byte) ((crcRes & 0x000000ff)); 
    byteStr[1] = (byte) ((crcRes & 0x0000ff00) >>> 8); 

    System.out.printf("%02X\n%02X", byteStr[0],byteStr[1]); 
} 

int calculate_crc(byte[] bytes) { 
    int i; 
    int crc_value = 0; 
    for (int len = 0; len < bytes.length; len++) { 
     for (i = 0x80; i != 0; i >>= 1) { 
      if ((crc_value & 0x8000) != 0) { 
       crc_value = (crc_value << 1)^0x8005; 
      } else { 
       crc_value = crc_value << 1; 
      } 
      if ((bytes[len] & i) != 0) { 
       crc_value ^= 0x8005; 
      } 
     } 
    } 
    return crc_value; 
} 

} 
+0

Tôi không biết cảm ơn bạn như thế nào. Tuyệt vời appriciated. Nhưng tôi không thể tránh khỏi việc hỏi, bạn thấy vấn đề gì giữa hai người đó? –

0

Có lẽ Bạn đang tìm kiếm này?

Crc16 in java

tôi sử dụng cùng một mảng (biến "bảng") trong phương pháp này:

public Integer computeCrc16(byte[] data) { 
    int crc = 0x0000; 
    for (byte b : data) { 
     crc = (crc >>> 8)^table[((crc^b) & 0xff)]; 

    } 

    return (int) crc; 
} 
+0

Thanks a lot trả lời của bạn. Tôi đã thử điều đó, nhưng không có cơ hội. Nó không cho tôi 0xbe 0xd9 byte. –

+0

Tôi đang đọc tài liệu. Tôi sẽ cố gắng để thực hiện các thuật toán trên Phụ lục A trong Java (có bạn đã cố gắng để làm điều đó?) –

+0

cũng thực sự tôi không có nhiều thông tin về c. về cơ bản tôi đã không chuyển đổi nó sang java. nhưng tôi nghĩ rằng đó là triển khai tương tự như bài đăng của bạn. Tôi chỉ sao chép phụ lục của một cái nhìn lên bảng byte để tôi và cố gắng với điều đó. và một lần nữa không thành công. Tôi đang ở cuối một dự án. để đạt được nó, đó là bước cuối cùng của tôi. –

0

Có triển khai CRC16 trong thời gian chạy Java (rt.jar) rồi.

Vui lòng xem grepcode để tìm nguồn.

Có thể bạn sẽ có thể nhìn thấy nó nếu bạn tìm kiếm CRC16 trong IDE của bạn:

picture of class search for CRC16