2013-11-22 24 views
1

我格式化BCD字段: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幾個修復程序,我很樂意分享)。

所以,我的問題是:它是一個錯誤,是固定的,還是我錯過 - 使用(很好的書面)庫和吠樹錯?

如果它是一個錯誤 - 它可以在我的代碼中修復某些面向對象的魔法(比如想要更改默認模板格式時擴展類Iso8583),或者修復必須位於lib本身以及何時一個新的lib版本會出現合併問題?

PS - 我是新的C#(有經驗的C程序員)

感謝。

+0

我想建議您創建一個[擴展方法](http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx),但現在我看到'FieldDescriptor.BcdVar'是一個'static'方法,你不能用新的靜態方法來擴展這個類。所以,是的,最好的方法是修補代碼並與社區共享修補程序。 :) – Groo

回答

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

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

就是這樣。希望得到解決方案的確認。

相關問題