1

这是另一个问题。

我对 Track 2(位 35)的要求是:

Z(数字 + X 'D' (BCD,D [1101] 的 ½ 字节表示,作为主帐号和到期日期之间的字段分隔符),BCD — 当奇数位数时,将最右半字节打包为 '0 '. 大小:可变为 37,前面是一个字节的 BCD 长度指示符

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

以虚拟 track2 为例:

12345678901234567=9999999999999999999

我将 '=' 分隔符替换为 0x0D 整数值,它转换为“13”(1101)。我们现在有:

12345678901234567139999999999999999999

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

4

2 回答 2

0

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

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

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

template[Bit._035_TRACK_2_DATA] = FieldDescriptor.BcdVar(2, 37, FieldValidators.Track2)
于 2012-05-08T07:49:04.313 回答
0

我有点重复了这个问题(BCD 中的 Track2 - '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# 的新手,很高兴能得到关于我的理论的确认。

谢谢。

于 2013-11-24T05:17:56.993 回答