6

Java でのバイト配列の CRC-16 実装の計算に問題があります。基本的に、タグへの書き込みを開始する RFID にバイトを送信しようとしています。Macでtcpdumpコマンドを見ると、配列のチェックサム値がわかります。しかし、私の目標はそれを自分で生成することです。これは、0xbe、0xd9 を生成する必要がある私のバイト配列です。

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 はヘッダーです。ドキュメントが言うように、それは除外されます。

この配列を Java (0xbe、0xd9) で試すと、RFID が機能します。私の問題は、これらのチェックサム値の生成です。ほぼウェブ全体を検索しましたが、チャンスはありませんでした。0xbe,0xd9 を生成するアルゴリズムは見つかりませんでした。

どんなアイデアでも大歓迎です。前もって感謝します。

編集:これはrfidで提供されたプロトコルです

4

4 に答える 4

3

これがCのcrc16アルゴリズムのJavaでの正しい翻訳であるかどうかはよくわかりません....しかし、あなたの例の正しい結果を示しています!

他の結果を Mac の CRC16 と比較し、使用する前にストレス テストを行ってください。

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;
}

}
于 2012-09-11T20:47:05.223 に答える
0

多分あなたはこれを探していますか?

JavaのCrc16

このメソッドでは、同じ配列 (変数「テーブル」) を使用します。

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

    }

    return (int) crc;
}
于 2012-09-11T14:43:31.750 に答える