这是另一个问题。
我对轨道2 (bit 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)。我们现在有:
1234567890123451399999999999999999
这有道理吗?我不认为这是正确的做法。
发布于 2012-05-08 07:49:04
您已经遇到了OpenIso8583.Net的“特性”。使用msg[3] = "123456"处理字段值时,必须始终处理未打包的值。
对于这个track2数据,您需要将轨道2构建为12345678901234567D9999999999999999999。注意数据中间的'D‘作为分隔符。
现在,在您的Template设置字段35中,本质上有一个BCD格式化程序。
template[Bit._035_TRACK_2_DATA] = FieldDescriptor.BcdVar(2, 37, FieldValidators.Track2)发布于 2013-11-24 05:17:56
我有点重复了这个问题(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 -银行知道什么.
关于的右填充,我想这就是调节器的用处所在。同样,我们需要添加一个带有调整器参数的静态方法,如下所示:
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#的新手,我很乐意得到关于我的理论的证实。
谢谢。
https://stackoverflow.com/questions/10485533
复制相似问题