BCD/ Двоичная нечетная ошибка индикатора длины

Я форматирую поле BCD:

  msg[60] = FieldDescriptor.BcdVar(3, 125, Formatters.Bcd);

Библиотека выдает исключение при упаковке сообщения. Это просто воспроизвести.

Я обнаружил, что как в BCD, так и в Binary Var, когда индикатор длины нечетный (1 или 3), возникает исключение.

Я изменил в VariableLengthFormatter.Pack():

  var lengthStr = length.ToString().PadLeft(LengthOfLengthIndicator, '0');

в

  var lengthStr = length.ToString().PadLeft(_lengthIndicator, '0');

использование распакованной длины для заполнения строки, и проблема была исправлена ​​(ну, я добавил FieldDescriptor.BinaryVar() и несколько исправлений в BinaryFormatter, которыми я буду рад поделиться).

Итак, мой вопрос: была ли это ошибка и была ли она исправлена, или я скучаю по использованию (красиво написанного) lib и лаю не на то дерево?

Если это ошибка - может ли она быть исправлена ​​в некоторой объектно-ориентированной магии в моем коде (например, расширение класса Iso8583 при желании изменить формат шаблона по умолчанию), или исправление должно быть в самой библиотеке и при новой версии библиотеки? выходит там будут проблемы слияния?

PS - я новичок в C# (опытный программист C)

Благодарю.

1 ответ

Как уже упоминалось в вопросе, я изменил в VariableLengthFormatter.Pack (...):

  var lengthStr = length.ToString().PadLeft(LengthOfLengthIndicator, '0');

в

  var lengthStr = length.ToString().PadLeft(_lengthIndicator, '0');

использование распакованной длины для заполнения строки индикатора длины нулями.

Следующая строка форматирует исправленный теперь указатель длины в соответствии с указанным форматером:

  var header = _lengthFormatter.GetBytes(lengthStr);

Это исправляет формат BCD.

Для двоичного формата я добавил в статический BinaryFormatter.GetBytes (...):

  if (value.Length % 2 == 1)
    value = value.PadLeft(value.Length + 1, '0');

добавив его к четному количеству кусков.

Я также изменил BinaryFormatter.GetPackedLength (...):

  return unpackedLength/2;

чтобы:

  return (unpackedLength + 1) / 2;

округление отформатированной длины вверх, а не вниз.

И в FieldDescriptor.cs после BinaryFixed(...) я добавил метод BinaryVar(...):

  public static IFieldDescriptor BinaryVar(int lengthIndicator, int maxLength, IFormatter lengthFormatter)
  {
      return Create(new VariableLengthFormatter(lengthIndicator, maxLength, lengthFormatter), FieldValidators.Hex, Formatters.Binary, null);
  }

Вот и все. Надеюсь получить подтверждения по исправлению.

Другие вопросы по тегам