2012-09-11 40 views
5

मुझे जावा में बाइट सरणी के सीआरसी -16 कार्यान्वयन की गणना करने में समस्याएं आ रही हैं। असल में मैं बाइट्स को एक आरएफआईडी भेजने की कोशिश कर रहा हूं जो एक टैग को लिखना शुरू कर देता है। मैं मैक पर tcpdump कमांड देखकर सरणी के चेकसम मूल्य देख सकता हूं। लेकिन मेरा लक्ष्य इसे अपने आप उत्पन्न करना है। यहां मेरा बाइट सरणी है जो 0xbe, 0xd9:सीआरसी 16 कार्यान्वयन जावा

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 शीर्षलेख है। जैसा कि दस्तावेज कहता है कि इसे बाहर रखा जाएगा।

जब भी मैं जावा पर इस सरणी को आजमाता हूं (0xbe, 0xd9 के साथ), आरएफआईडी काम करता है। मेरी समस्या उन चेकसम मूल्यों का उत्पादन है। मैंने लगभग पूरे वेब की खोज की लेकिन कोई मौका नहीं। मुझे कोई एल्गोरिदम नहीं मिला जो 0xbe, 0xd9 उत्पन्न करता है।

कोई भी विचार मेरे लिए सबसे ज्यादा स्वागत है। अग्रिम में धन्यवाद।

संपादित करें: here is the protocol कि आरएफआईडी

उत्तर

2

मैं वास्तव में यकीन नहीं है अगर यह सी के जावा में सही अनुवाद है crc16 एल्गोरिदम .... लेकिन यह आपके उदाहरण के लिए सही परिणाम दिखाता है!

मैक के सीआरसी 16 के साथ अन्य परिणामों की तुलना करें और इसका उपयोग करने से पहले इसे पर तनाव परीक्षण करें।

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

मुझे नहीं पता कि आपको धन्यवाद कैसे दिया जाए। बहुत सराहना की। लेकिन मैं खुद से पूछने से नहीं रोक सकता, आप उन दोनों के बीच की समस्या के रूप में क्या देखते हैं? –

0

के साथ प्रदान की शायद तुम इस के लिए देख रहे हैं?

Crc16 in java

मैं इस विधि में एक ही सरणी (चर "तालिका") का उपयोग करें:

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

    } 

    return (int) crc; 
} 
+0

धन्यवाद आपके उत्तर के लिए एक बहुत। मैंने पहले ही कोशिश की है, लेकिन कोई मौका नहीं है। यह मुझे 0xbe 0xd9 बाइट्स नहीं देता है। –

+0

मैं प्रलेखन पढ़ रहा हूँ। मैं जावा में परिशिष्ट ए पर एल्गोरिदम लागू करने का प्रयास करूंगा (क्या आपने पहले से ही ऐसा करने की कोशिश की है?) –

+0

वास्तव में मेरे पास सी के बारे में बहुत अधिक जानकारी नहीं है। मूल रूप से मैंने इसे जावा में परिवर्तित नहीं किया। लेकिन मुझे लगता है कि यह आपकी पोस्ट के समान कार्यान्वयन है। मैंने केवल परिशिष्ट की एक तालिका को बाइट्स की प्रतिलिपि बनाई और इसके साथ प्रयास किया। और फिर कोई सफलता नहीं। मैं एक परियोजना के अंत में हूँ। इसे प्राप्त करने के लिए, यह मेरा आखिरी कदम है। –

0

जावा रनटाइम (rt.jar) पहले से ही में एक CRC16 कार्यान्वयन नहीं है।

कृपया स्रोत के लिए grepcode देखें।

आप शायद अपने आईडीई में यह देखने के लिए कि आप CRC16 के लिए खोज में सक्षम हो जाएगा:

picture of class search for CRC16