2015-09-22 20 views
5

मेरे पास एक फिक्स मैसेज है और मैं मैन्युअल रूप से चेकसम की गणना करना चाहता हूं।मैन्युअल रूप से ठीक से चेकसम की गणना कैसे करें?

8=FIX.4.2|9=49|35=5|34=1|49=ARCA|52=20150916-04:14:05.306|56=TW|10=157| 

यहाँ bodylength गणना की जाती है:

8=FIX.4.2|9=49|35=5|34=1|49=ARCA|52=20150916-04:14:05.306|56=TW|10=157| 
0  + 0 + 5 + 5 + 8  + 26      + 5 + 0 = 49(correct) 

checksum 157 (10 = 157) है। इस मामले में इसकी गणना कैसे करें?

उत्तर

6

आपको संदेश में प्रत्येक बाइट को जोड़ना होगा, लेकिन चेकसम फ़ील्ड सहित नहीं। फिर यह संख्या मॉड्यूलो 256 लें, और इसे प्रमुख शून्यों के साथ 3 वर्णों के रूप में प्रिंट करें (उदा। चेकसम = 13 013 बन जाएगा)। ठीक विकी है

लिंक: FIX checksum

सी में एक उदाहरण कार्यान्वयन: example

+0

"हर बाइट राशि को छोड़कर पूरे ठीक संदेश लेता है संदेश में "। क्या आप इसे इस मामले में लिख सकते हैं? – anhtv13

+0

@ANguyen लिंक और उदाहरण के साथ संपादित –

+0

मैं अभी भी उस उदाहरण को समझ नहीं पा रहा हूं। मैं सी # लिखता हूँ। अगर मेरे पास फिक्स मैसेज है: {8 = FIX.4.29 = 4935 = 534 = 149 = ARCA52 = 20150916-04: 14: 05.30656 = TW10 = 157}। इसे 157 तक कैसे गिनें? – anhtv13

1
static void Main(string[] args) 
    { 
     //10=157 
     string s = "8=FIX.4.2|9=49|35=5|34=1|49=ARCA|52=20150916-04:14:05.306|56=TW|"; 
     byte[] bs = GetBytes(s); 
     int sum=0; 
     foreach (byte b in bs) 
      sum = sum + b; 
     int checksum = sum % 256; 
    } 
    //string to byte[] 
    static byte[] GetBytes(string str) 
    { 
     byte[] bytes = new byte[str.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 
     return bytes; 
    } 
+0

टिप्पणी 1: FIX संदेशों में सेपरेटर एसओएच चरित्र है; नहीं | प्रतीक (पाइप प्रतीक)। एसओएच चरित्र का बाइट मान 1 है। "8 = FIX.4.2 | ..." '' '' 8 = FIX.4.2 \ u0001 ... "' –

+2

टिप्पणी 2: उचित बाइट- एक स्ट्रिंग की सरणी, कृपया [फील्डबेस देखें।QuickFIX/N लाइब्रेरी में कुल विधि प्राप्त करें] (https://github.com/connamara/quickfixn/blob/master/QuickFIXn/Fields/FieldBase.cs)। असल में लाइन 'बाइट [] बीएस = गेटबाइट्स; '' बाइट [] बीएस = सिस्टम .ext.Encoding.UTF8.GetBytes (ओं) होना चाहिए; ' –

+0

ठीक है, धन्यवाद। मै समझता हुँ। – anhtv13

1

रेडी-टू-रन सी उदाहरण से here

8 = ठीक अनुकूलित .4.2 | 9 = 49 | 35 = 5 | 34 = 1 | 49 = ARCA | 52 = 20,150,916-04: 14: ०५.३०६ | 56 = TW | 10 = 157 |

#include <stdio.h> 

void GenerateCheckSum(char *buf, long bufLen) 
{ 
     unsigned sum = 0; 
     long i; 
     for(i = 0L; i < bufLen; i++) 
     { 
      unsigned val = (unsigned)buf[i]; 
      sum += val; 
      printf("Char: %02c Val: %3u\n", buf[i], val); // print value of each byte 
     } 
     printf("CheckSum = %03d\n", (unsigned)(sum % 256)); // print result 
} 

int main() 
{ 
    char msg[] = "8=FIX.4.2\0019=49\00135=5\00134=1\00149=ARCA\00152=20150916-04:14:05.306\00156=TW\001"; 
    int len = sizeof(msg)/sizeof(msg[0]); 
    GenerateCheckSum(msg, len); 
} 

बिंदुओं को नोट करने के लिए

  • GenerateCheckSum checksum क्षेत्र
  • Delimiter SOH\001 रूप में लिखा है जो ASCII value1
संबंधित मुद्दे