1

我正在格式化 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');

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

所以,我的问题是:这是一个错误并已修复,还是我错过了使用(写得很好)库并吠叫了错误的树?

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

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

谢谢。

4

1 回答 1

1

如问题中所述,我更改了VariableLengthFormatter.Pack(...)

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

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

使用解压后的长度用零填充 Length-Indicator 字符串。

下一行根据指定的格式化程序格式化现在更正的 Length-Indicator:

  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(...)方法:

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

而已。希望得到修复的确认。

于 2013-11-23T21:13:28.420 回答