OpenISO8583.Net BCD отформатированный трек 2

Вот еще один вопрос.

Мое требование для дорожки 2 (бит 35):

Z (Числовой + X 'D' (BCD, ½-байтовое представление D [1101] в качестве разделителя полей между основным номером учетной записи и датой истечения срока действия), BCD - При нечетном количестве цифр упаковать самый правый полубайт в '0 Размер: переменная до 37, перед которой стоит однобайтовый индикатор длины BCD

Определение шаблона по умолчанию имеет бит 35 как поле Ascii длиной 2 байта, поэтому я уверен, что это не так. Я изменил его на BcdVar(1, 37, Formatters.Bcd).

Возьмем фиктивный пример track2:

12345678901234567 = 9999999999999999999

Я заменяю разделитель '=' целочисленным значением 0x0D, которое переводится как "13" (1101). Теперь у нас есть:

12345678901234567139999999999999999999

Имеет ли это смысл? Я не думаю, что это правильный способ сделать это.

2 ответа

Решение

Вы столкнулись с "особенностью" OpenIso8583.Net. Когда вы работаете со значениями поля, используя msg[3] = "123456", вы всегда должны работать с распакованными значениями.

Для этих данных track2 вам нужно создать дорожку 2 как 12345678901234567D9999999999999999999, Обратите внимание на "D" в середине данных в качестве разделителя.

Теперь в вашем Template установите поле 35, чтобы иметь форматировщик BCD, по существу.

template[Bit._035_TRACK_2_DATA] = FieldDescriptor.BcdVar(2, 37, FieldValidators.Track2)

Я как бы продублировал вопрос ( Track2 в BCD - символ "D").

Обрабатывать поле как двоичное (с BCD-Length-Indicator!!!) - милая хитрость, которая может сработать. Но, все же - нет способа:

  public static FieldDescriptor.BinaryVar(..., ILengthFormatter lengthFormatter)

поэтому вместо его добавления (что должно быть сделано в любом случае для полей BinaryVar) можно добавить:

  public static FieldDescriptor.BcdVar(..., IFieldValidator validator)

и позвоните:

  msg[Bit._035_TRACK_2_DATA] = FieldDescriptor.BcdVar(2, 37, FieldValidators.Track2);

буква "D" будет рассматриваться как BCD - что знают банки...


Относительно правильной подкладки - я думаю, именно здесь Настройщик пригодится. Опять же, нам нужно добавить статический метод с параметром Adjuster:

  var setAdjuster = new LambdaAdjuster(setLambda: value => value.PadRight(value.length + 1, '0'));

Это правда - вы можете добавить значение до установки поля, но это не весело (мы гики, не так ли?).


Что касается добавления статических методов в FieldDescriptor - я думаю, что можно использовать общий

  public static IFieldDescriptor Create(ILengthFormatter lengthFormatter, IFieldValidator fieldValidator, IFormatter formatter, Adjuster adjuster)

но я новичок в C# и был бы рад получить подтверждение относительно моих теорий.

Благодарю.

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