OpenISO8583.Net BCD格式化轨道2

时间:2012-05-07 16:20:12

标签: iso8583 openiso8583.net

这是另一个问题。

我对Track 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

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

12345678901234567139999999999999999999

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

我有点复制了问题(Track2 in BCD - 'D' character)。

将字段视为二进制(使用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'));

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


关于向FieldDescriptor添加静态方法 - 我想可以使用泛型

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

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

感谢。