Viswash Manik Ответов: 1

Как рассчитать правильную контрольную сумму для исправленных сообщений?


Следующий код получает сообщения об успешном входе в систему, но когда я отправляю запрос котировки во 2-м сообщении, он не отвечает и посылает мне Сердцебиение через 30 секунд.Кто-то сказал мне, что я неправильно вычисляю контрольную сумму, поэтому Fix-server игнорирует сообщение price-request.Можете ли вы дать мне какую-нибудь подсказку, почему это не работает для 2-го сообщения?

Что я уже пробовал:

public static int total;

time = DateTime.UtcNow.ToString("yyyyMMdd-HH:mm:ss.fff");

                                body = "35=V|49=" + FixID + "|56=CSERVER|34="+msgSeqenceNum+"|52=" + time + "|50=QUOTE|57=QUOTE|262=13203481x|263=1|264=1|265=1|146=1|55=1|267=2|269=0|269=1|";

                                // body length
                                bodylen = body.Length;
                                string fix = "8=FIX.4.4|9=" + bodylen + "|";

                                // message
                                message = fix + body;

                                message = message.Replace('|', '\u0001');
                            int total2 = 0;
                                messageBytes = Encoding.ASCII.GetBytes(message);//converted to 0's &1s
                                for (int i = 0; i < message.Length; i++)
                                    total2 += messageBytes[i];

                                checksum = total2 % 256;
                                checksumStr = checksum.ToString().PadLeft(3, '0');

                                sum = "10=" + checksumStr + "|";
                                m = fix + body + sum;
                                m = m.Replace('|', '\u0001');

Graeme_Grant

Что говорится в документации службы хоста относительно расчета?

Viswash Manik

Привет, Грэм, значение контрольной суммы было рассчитано в соответствии со стандартными рекомендациями по исправлению ошибок.

1 Ответов

Рейтинг:
2

Garth J Lancaster

Цитата:
Можете ли вы дать мне какую-нибудь подсказку, почему это не работает для 2-го сообщения?


посмотрите, где у вас определено "total" ... вы сбрасываете значение total перед тем, как получить контрольную сумму для вашего второго сообщения ?

Я бы взломал этот код, чтобы получить контрольную сумму

message = message.Replace('|', '\u0001');
 byte[] messageBytes = Encoding.ASCII.GetBytes(message);
 for (int i = 0; i < message.Length; i++)
 total += messageBytes[i];

 int checksum = 0;
 foreach (byte chData in messageBytes)
 {
     checksum += chData;
 }

 checksum = total % 256;
 string checksumStr = checksum.ToString().PadLeft(3, '0');


в отдельную функцию / процедуру/метод-вы повторяете код, очень плохая идея - если вы сломаете этот код из каждого места, вы можете пойти

checksumStr = getChecksum(message);


например .. тогда вы можете удалить эту катастрофу
Цитата:
public static int total;
от вашего клиента

Пока я здесь, я вложу свои 2 цента в создание подобных сообщений путем конкатенации строк - это едва ли нормально для теста - я ожидаю, что кто - то, работающий на меня, создаст класс построителя сообщений для каждого типа сообщений (так что он начинается как абстрактный класс), что вы передадите ему значения, и он построит сообщение красиво - ваши сообщения, как они есть, трудно расширить, отладить и т. д. :)


Jochen Arndt

Мой 5.

Я просто пропустил заметку о бесполезном цикле foreach.

Viswash Manik

@Гарт ... ха-ха-ха, извините за ошибки, сэр. Я этого не заметил. Я начал изучать c# 2 недели назад :P

Garth J Lancaster

не беспокойтесь - нам всем когда - нибудь придется учиться- если бы вы использовали отладчик, вы могли бы посмотреть на вторую контрольную сумму calc и увидеть ,что "total" уже имеет значение

Я бы отметил, что вы также заново изобретаете колесо-там есть библиотека (ну, несколько), но "QuickFix" может облегчить вам жизнь http://www.quickfixengine.org/documentation.html