1

ここに別の質問があります。

トラック2(ビット35)の私の要件は次のとおりです。

Z(数値+ X'D'(BCD、プライマリアカウント番号と有効期限の間のフィールド区切り文字としてのD [1101]の½バイト表現)、BCD —桁数が奇数の場合、右端のハーフバイトを'0にパックします。 '。サイズ:37まで可変、前に1バイトのBCD長さ標識

デフォルトのテンプレート定義には、2バイト長のASCIIフィールドとしてビット35があるので、そうではないと確信しています。BcdVar(1、37、Formatters.Bcd)に変更しました。

次のダミートラック2の例を取り上げます。

12345678901234567 = 9999999999999999999

'='区切り文字を、 "13"(1101)に変換される0x0D整数値に置き換えます。私たちは今持っています:

12345678901234567139999999999999999999

これは意味がありますか?これが正しいやり方ではないと思います。

4

2 に答える 2

0

OpenIso8583.Net の「機能」に遭遇しました。を使用してフィールド値を操作するmsg[3] = "123456"場合は、常にアンパックされた値を操作する必要があります。

このトラック 2 データの場合、トラック 2 を として構築する必要があります12345678901234567D9999999999999999999。データの真ん中にある 'D' は区切り記号として注意してください。

Template基本的に、セット フィールド 35 に BCD フォーマッタを配置します。

template[Bit._035_TRACK_2_DATA] = FieldDescriptor.BcdVar(2, 37, FieldValidators.Track2)
于 2012-05-08T07:49:04.313 に答える
0

私は質問を複製しました(BCDのトラック2 - 'D'文字)。

フィールドを Binary として扱う ( BCD-Length-Indicator を使用!!! ) のは、うまくいくかもしれないかわいいトリックです。しかし、まだ - 方法はありません:

  public static FieldDescriptor.BinaryVar(..., ILengthFormatter lengthFormatter)

したがって、それを追加する代わりに (BinaryVar フィールドの場合はとにかく実行する必要があります)、以下を追加できます。

  public static FieldDescriptor.BcdVar(..., IFieldValidator validator)

そして呼び出します:

  msg[Bit._035_TRACK_2_DATA] = FieldDescriptor.BcdVar(2, 37, FieldValidators.Track2);

「D」はBCDとして扱われます - 銀行は何を知っていますか...


右側のパディングについては、アジャスターが便利なところだと思います。繰り返しますが、次のように、 Adjusterパラメーターを使用して静的メソッドを追加する必要があります。

  var setAdjuster = new LambdaAdjuster(setLambda: value => value.PadRight(value.length + 1, '0'));

確かに、フィールドを設定する前に値をパディングすることはできますが、それは楽しいことではありません (私たちはオタクですよね?)。


FieldDescriptor への静的メソッドの追加について- ジェネリックを使用することは可能だと思います

  public static IFieldDescriptor Create(ILengthFormatter lengthFormatter, IFieldValidator fieldValidator, IFormatter formatter, Adjuster adjuster)

しかし、私は C# を初めて使用するので、私の理論について確認していただければ幸いです。

ありがとう。

于 2013-11-24T05:17:56.993 に答える