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);
}
Вот и все. Надеюсь получить подтверждения по исправлению.