这是另一个问题。
我对轨道 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# 的新手,很高兴得到关于我的理论的确认。
谢谢。