COMP フィールドの変換について質問しましたが、回答がありませんでした。
stack-overflow がこの質問に役立つことを願っています。
COMP-3を10進数に変換することに成功しました。アンパックされた 10 進数を COMP-3 に変換する際に、任意の高レベル プログラミング言語で、できれば Java または c#.net で助けてください。
COMP フィールドの変換について質問しましたが、回答がありませんでした。
stack-overflow がこの質問に役立つことを願っています。
COMP-3を10進数に変換することに成功しました。アンパックされた 10 進数を COMP-3 に変換する際に、任意の高レベル プログラミング言語で、できれば Java または c#.net で助けてください。
パック 10 進数では、-123 は X'123d' として表されます (最後のニブル c、d または f は符号です)。パック 10 進数を処理する最も簡単な方法の 1 つは、単純にバイトを 16 進文字列に変換し (または必要に応じてその逆)、通常の文字列操作を使用することです。これは最も効率的ではないかもしれませんが、実装は簡単です。
したがって、整数 (値) をパック 10 進数に変換するのは大まかです (注: コードはテストしていません)。
String sign = "c";
if (value < 0) {
sign = "d";
value = -1 * value;
}
String val = value + "d"
byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();
以下は、comp3 との間で変換するためのコード例です。バイト配列からパック 10 進数を取得するには、http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src のメソッド getMainframePackedDecimal を参照してください。 /net/sf/JRecord/Common/Conversion.java?revision=3&view=マークアップ
パック 10 進数を設定するには、 http: //record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view の setField を参照してください。 =マークアップ
どちらのルーチンも、バイト配列、開始位置、およびフィールド位置の長さのいずれかを取ります。
ウェブ上でこれを行う他の例があります (JRanch にも変換を行うためのコードがあると思います)。
ゾーン 10 進数を comp-3 に変換するのは非常に簡単です。下位バイトのニブルを反転し、他のすべてのバイトの上位ニブルを取り除きます。
数値 12345 を考えてみましょう -- パック 10 進数表記では、x'12345C' または x'12345F' (C と F は両方とも +、AB と D は -) になります。これをゾーン 10 進数に変換したとき、下位ニブルを反転し、各桁の間の上位ニブルに「F」を挿入しました。x'F1F2F3F4C5' に変換します。
元に戻すには、プロセスを逆にするだけです。Java を使用すると、次のようになります。
byte[] myDecimal = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5 };
byte[] myPacked = new byte[3];
//Even low nibble moved to high nibble and merged with odd low nibble
myPacked[0] = ((myDecimal[0] & 0b00001111) << 4)) | (myDecimal[1] & 0b00001111);
myPacked[1] = ((myDecimal[2] & 0b00001111) << 4)) | (myDecimal[3] & 0b00001111);
//Last byte gets filpped for sign
myPacked[2] = ((myDecimal[5] & 0b00001111) << 4)) | (myDecimal[4] & 0b00001111);
過去にJavaでCOMP-3をいじったとき、バイトを読み取って数値に変換するメソッドを作成することになりました。COMP-3 を書き出す必要はなかったと思いますが、同じロジックを逆に使用すると思います。