BCD /二进制奇数长度指示器错误

时间:2013-11-22 07:54:27

标签: c# bcd openiso8583.net

我正在格式化BCD字段:

  msg[60] = FieldDescriptor.BcdVar(3, 125, Formatters.Bcd);

在打包邮件时,lib会抛出异常。它很容易重现。

我发现在BCD和Binary Var中,当长度指示符为奇数(1或3)时,会发生异常。

我改变了VariableLengthFormatter.Pack():

  var lengthStr = length.ToString().PadLeft(LengthOfLengthIndicator, '0');

  var lengthStr = length.ToString().PadLeft(_lengthIndicator, '0');

使用解压缩长度来填充字符串,问题得到解决(好吧,我添加了 FieldDescriptor.BinaryVar()以及 BinaryFormatter 中的一些修复,其中我我很乐意分享。

所以,我的问题是:它是一个错误并且被修复了,或者我错过了 - 使用(编写得很好的)lib并咆哮错误的树?

如果它是一个错误 - 它可以在我的代码中修复一些面向对象的魔法(比如在想要更改默认模板格式时扩展类Iso8583),或者修复必须在lib本身和新的lib版本会出现合并问题吗?

PS - 我是C#(经验丰富的C程序员)的新手

感谢。

1 个答案:

答案 0 :(得分:1)

正如问题所述,我改变了 VariableLengthFormatter.Pack(...)

  var lengthStr = length.ToString().PadLeft(LengthOfLengthIndicator, '0');

  var lengthStr = length.ToString().PadLeft(_lengthIndicator, '0');

使用解压长度用零填充长度指示符字符串。

下一行根据指定的格式化程序格式化现在更正的长度指示器:

  var header = _lengthFormatter.GetBytes(lengthStr);

修复了BCD格式。

对于二进制格式,我添加到静态BinaryFormatter.GetBytes(...)

  if (value.Length % 2 == 1)
    value = value.PadLeft(value.Length + 1, '0');

将其填充为偶数个半字节。

我也改变了 BinaryFormatter.GetPackedLength(...)

  return unpackedLength/2;

为:

  return (unpackedLength + 1) / 2;

将格式化的长度向上舍入,而不是向下。

FieldDescriptor.cs 中,在 BinaryFixed(...)之后,我添加了 BinaryVar(...)方法:< / p>

  public static IFieldDescriptor BinaryVar(int lengthIndicator, int maxLength, IFormatter lengthFormatter)
  {
      return Create(new VariableLengthFormatter(lengthIndicator, maxLength, lengthFormatter), FieldValidators.Hex, Formatters.Binary, null);
  }

就是这样。希望得到关于修复的确认。