0

code.google からコードをダウンロードし、最新バージョン v0.5.2
を取得します。フィールドを bcd fix 形式で設定します。これは bcd 形式の N-6 です(bit._003_proc_code)
例:
*フィールド定義:<br/> DefaultTemplate =new Template { { Bit._002_PAN, FieldDescriptor.BcdVar(2, 19,Formatters.Ascii) }, { Bit._003_PROC_CODE, FieldDescriptor.BcdFixed(3)}, { Bit._004_TRAN_AMOUNT, FieldDescriptor.BcdFixed(6) }, . …………}

利用方法:

Iso8583 msg =new Iso8584();
msg[3]="000000";

メッセージを解凍すると、メッセージ 3 から「0000」しか取得できません。
これはバグですか、それとも定義のエラーですか

4

1 に答える 1

0

これが単なるコーディング エラーかどうかを確認するために、John Oxley からの連絡を待ちたいと思います。私がそう言った今、私はそれがバグだと思います。

私は BcdFixed 定義に問題があり、問題を回避するために新しい固定長 BCD フォーマッタを作成することになりました。

これが私がしたことです:

  1. FixedLengthFormatter クラスのバリエーションである FixedLengthBcdFormatter というクラスを作成しました。

    /// /// 固定フィールド フォーマッタ /// public class FixedLengthBcdFormatter : ILengthFormatter { private readonly int _packedLength; プライベート読み取り専用 int _unPackedLength;

    ///<summary>
    ///  Fixed length field formatter
    ///</summary>
    ///<param name = "unPackedLength">The unpacked length of the field.</param>
    public FixedLengthBcdFormatter(int unPackedLength)
    {
        _unPackedLength = unPackedLength;
        double len = _unPackedLength;
       _packedLength =  (int)Math.Ceiling(len / 2);
    }
    
    #region ILengthFormatter Members
    
    /// <summary>
    ///   Get the length of the packed length indicator.  For fixed length fields this is 0
    /// </summary>
    public int LengthOfLengthIndicator
    {
        get { return 0; }
    }
    
    /// <summary>
    ///   The maximum length of the field displayed as a string for descriptors
    /// </summary>
    public string MaxLength
    {
        get { return _unPackedLength.ToString(); }
    }
    
    /// <summary>
    ///   Descriptor for the length formatter used in ToString methods
    /// </summary>
    public string Description
    {
        get { return "FixedBcd"; }
    }
    
    /// <summary>
    ///   Get the length of the field
    /// </summary>
    /// <param name = "msg">Byte array of message data</param>
    /// <param name = "offset">offset to start parsing</param>
    /// <returns>The length of the field</returns>
    public int GetLengthOfField(byte[] msg, int offset)
    {
        return _unPackedLength;
    }
    
    /// <summary>
    ///   Pack the length header into the message
    /// </summary>
    /// <param name = "msg">Byte array of the message</param>
    /// <param name = "length">The length to pack into the message</param>
    /// <param name = "offset">Offset to start the packing</param>
    /// <returns>offset for the start of the field</returns>
    public int Pack(byte[] msg, int length, int offset)
    {
        return offset;
    }
    
    /// <summary>
    ///   Check the length of the field is valid
    /// </summary>
    /// <param name = "packedLength">the packed length of the field</param>
    /// <returns>true if valid, false otherwise</returns>
    public bool IsValidLength(int packedLength)
    {
        return packedLength == _packedLength;
    }
    
    #endregion
    

    }

  2. FieldDescription クラスの修正 / BcdFixed 宣言

    /// /// bcd が修正されました。/// /// /// 長さ。/// /// /// public static IFieldDescriptor BcdFixed(int unpackedLength) { return Create(new FixedLengthBcdFormatter(unpackedLength), FieldValidators.N, Formatters.Bcd, null); }

  3. 次に、フォーマッタ宣言を変更して、展開された長さをパラメータとして提供します。

    Bit._003_PROC_CODE, FieldDescriptor.BcdFixed(6)},

繰り返しますが、既存のコードについて何も知らなかったので、これはすべて不必要だったかもしれませんが、私にとってはうまくいっています。

これが役立つことを願っています。

于 2012-05-16T04:53:52.867 に答える