【问题标题】:OpenISO8583.Net BCD Formatted Track 2OpenISO8583.Net BCD 格式轨道 2
【发布时间】:2012-05-07 16:20:11
【问题描述】:

这是另一个问题。

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

Z (Numeric + X 'D' (BCD, ½ byte representation of D [1101] as a field separator between Primary Account Number and Expiration Date), BCD — 当奇数位数时,打包最右边的半字节到“0”。大小:可变为 37,前面是一个字节的 BCD 长度指示符

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

以虚拟 track2 为例:

12345678901234567=9999999999999999999

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

12345678901234567139999999999999999999

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

【问题讨论】:

  • 我也意识到转换为 BCD 需要左对齐。如果需要,它会在右侧填充,而不是像普通数字那样在左侧填充。这也适用于位 2 (PAN)。看来我要创建一个新的 BCD 格式化程序类来支持这一点。

标签: iso8583 openiso8583.net


【解决方案1】:

您遇到了 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)

【讨论】:

  • 在源代码上我的定义是无效的。 FieldDescriptor.BcdVar 不采用 FieldValidators 参数,仅采用长度格式化程序。如果我使用 Formatters.Bcd 定义它,它会在尝试转换“D”值时引发异常。填充也必须在右侧,BCD 放在左侧。
  • 我不确定我是否做对了,但我认为这些字段应该被视为具有额外填充的二进制(十六进制值)的等效项,因为字段大小是可变的。在某个时候,我意识到生成的 BCD 值与从十六进制到字节数组转换的值完全相同。我正在创建一个新的格式化程序类来支持这一点。我的初始测试似乎按预期工作。
  • 我将此标记为已回答。我想这只是学习代码并定制任何不存在的功能的问题。感谢您创建此库。
  • 嗨,El,您能分享一下您的新格式化程序代码吗?我看到我正在以同样的方式移动。 TIA
【解决方案2】:

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

将字段视为二进制(使用 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 - 银行知道什么...


关于 right-padding - 我想这就是 Adjuster 派上用场的地方。同样,我们需要添加一个带有 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# 新手,很高兴能得到关于我的理论的确认。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多