2012-10-04 18 views
5

मुझे एनएमईए वाक्यों के लिए चेकसम की गणना करने में समस्या है। मैं निम्नलिखित जावा कोड का उपयोग कर रहा:एनएमईए चेकसम गणना

private static String getSum(String in) { 
    int checksum = 0; 
    if (in.startsWith("$")) { 
     in = in.substring(1, in.length()); 
    } 

    int end = in.indexOf('*'); 
    if (end == -1) 
     end = in.length(); 
    for (int i = 0; i < end; i++) { 
     checksum = checksum^in.charAt(i); 
    } 
    String hex = Integer.toHexString(checksum); 
    if (hex.length() == 1) 
     hex = "0" + hex; 
    return hex.toUpperCase(); 
} 

इस कोड को इंटरनेट भर के कई अन्य उदाहरण के समान है और सब कुछ ठीक काम करता है जब तक मैं इस तरह एक वाक्य की कोशिश ..

$PSRF101,-2686700,-4304200,3851624,96000,497260,921,12,3*1C

यह वाक्य NMEA Reference Manual से है और इसलिए मुझे लगता है कि चेकसम सही होगा। लेकिन जब मैं इसकी गणना करता हूं, तो मुझे चेकसम के रूप में * 2 एफ मिलता है और 1 सी नहीं।

मुझे लगता है कि यह वाक्य में नकारात्मक मूल्यों के कारण है, लेकिन मुझे कोई संकेत नहीं है कि उनके साथ कैसे निपटें। क्या किसी के पास कोई सुझाव है?

+1

'-' संकेत कोई फर्क नहीं पड़ता: चेकसम अभी भी' 2F' –

+0

गलत होगा, प्रत्येक वर्ण योगदान देता है। यदि, हालांकि, आप उन दोनों डैश को हटाते हैं जो आप प्रभावी रूप से दो बार कर रहे हैं ... जो आपको वापस ले जाता है जहां आप थे। एक या दूसरे को हटाकर परिणाम बदल जाता है। – Anders8

उत्तर

8

अनुमानित और गणना किए गए चेकसम का अंतर (या एक अतिरिक्त वर्ण '3') को छोड़ने के बराबर है; इसलिए मैं एनएमईए संदर्भ मैनुअल में त्रुटि में विश्वास करने के लिए लुभाना चाहता हूं।

आप परिणामों को सत्यापित करने के लिए कुछ ऑनलाइन एनएमईए कैलक्यूलेटर आज़मा सकते हैं।
उदा। http://www.hhhh.org/wiml/proj/nmeaxor.html

+0

सिर्फ मैनुअल में कम से कम एक अन्य गलत आदेश "$ GPMSK, 318.0, ए, 100, एम, 2, * 45" है, जिसमें अतिरिक्त कॉमा –

+1

है, तो यह मैन्युअल की त्रुटि हो सकती है? क्योंकि "$ PSRF104,37.3875111, -121.97232,0,96000,237759,1946,12,1 * 07" भी गलत होगा, मुझे अपने कोड और ऑनलाइन कैलक्यूलेटर से "* 06" मिलता है, मैनुअल कहता है "* 07 "। यहां नकारात्मक मान फिर से हैं, इसलिए मैंने सोचा कि यह उनके कारण गलत हो सकता है। – htz

+1

06 और 07 के बीच की त्रुटि हेक्साडेसिमल में बस 01 है। यह सुझाव देगा कि कुछ (शायद अंतिम चरित्र) 1 के बजाय 0 होना चाहिए था। फिर चेकसम मिलान होगा। '-' संकेत त्रुटि में योगदान नहीं लगते हैं। –

संबंधित मुद्दे