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# и был бы рад получить подтверждение относительно моих теорий.
Благодарю.