这是另一个问题。
我对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
这有意义吗?我不认为这是正确的做法。
答案 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#的新手,很高兴得到关于我的理论的确认。
感谢。