OpenISO8583.Net BCD 格式的轨道 2



这是另一个问题。

我对轨道 2(位 35(的要求是:

Z(数字 + X 'D'(BCD,D [1101] 的 1/2 字节表示形式,作为主帐号和到期日期之间的字段分隔符(,BCD — 当数字为奇数时,将最右边的半字节打包为"0"。大小:可变为 37,前面有一个单字节的 BCD 长度指示器

默认模板定义将位 35 作为 2 字节长度的 Ascii 字段,所以我确定不是这样。我把它改成了BcdVar(1, 37, Formatters.Bcd(。

以虚拟轨道2为例:

12345678901234567=9999999999999999999

我将"="分隔符替换为转换为"13"(1101(的0x0D整数值。我们现在有:

12345678901234567139999999999999999999

这有意义吗?我不认为这是正确的做法。

你遇到了 OpenIso8583.Net 的"功能"。 使用 msg[3] = "123456" 处理字段值时,必须始终使用解压缩的值。

对于此 track2 数据,您需要将轨道 2 构建为 12345678901234567D9999999999999999999 。 请注意数据中间的"D"作为分隔符。

现在在您的Template设置字段 35 中,基本上有一个 BCD 格式化程序。

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

我有点重复这个问题(BCD 中的 Track2 - "D"字符(。

将字段视为二进制(带有 BCD 长度指示器!!(是一个可爱的技巧,它可能会解决问题。但是,仍然 - 没有方法:

  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'));

这是真的 - 您可以在设置字段之前填充值,但这并不好玩(我们是极客,不是吗?

<小时 />

关于向字段描述符添加静态方法 - 我想可以使用泛型

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

但我是 C# 的新手,很高兴得到关于我的理论的确认。

谢谢。

最新更新