我正在格式化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程序员)的新手
感谢。
答案 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);
}
就是这样。希望得到关于修复的确认。