未梱包の小数をCOMP-3に変換する方法は? [閉まっている
-
30-09-2019 - |
質問
コンプフィールドの変換について質問しましたが、それについては答えが得られませんでした。
Stack-overflowがこの質問について私を助けることができることを願っています。
Comp-3を小数に変換することに成功しました。梱包された小数点以下をCOMP-3に変換する際に、任意の高レベルのプログラミング言語で、できればJavaまたはC#.NETであなたの助けが必要です。
解決
詰め込まれた10進数では、-123はx'123d '(最後のナイブルc、dまたはfが記号)として表されます。パックされた小数を処理する最も簡単な方法の1つは、単純にバイトを16進ストリングに変換する(または必要に応じてその逆)、通常の文字列操作を使用することです。これは最も効率的ではないかもしれませんが、簡単に実装できます。
したがって、整数(値)を詰めた小数に変換することは大まかです(注:コードをテストしていません)
String sign = "c";
if (value < 0) {
sign = "d";
value = -1 * value;
}
String val = value + "d"
byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();
以下は、comp3に変換するためのいくつかの例コードです。バイトの配列から詰められた小数を取得 http://record-editor.svn.sourceforge.net/viewvc/record-editor/source/jrecord/src/net/sf/jrecord/common/conversion.java?revision=3&view=markup
詰め込まれた小数を設定するには、Setfieldを参照してください http://record-editor.svn.sourceforge.net/viewvc/record-editor/source/jrecord/src/net/sf/jrecord/Types/TypackedDecimal.java?revision=3&view=markup
どちらのルーチンも、バイトの配列、開始位置、フィールド位置の長さのいずれかを取ります。
これをWebで行う他の例があります(Jranchもコンバージョンを行うためのコードがあると思います)、少しグーグルを行います。
他のヒント
ゾーンの小数をcomp-3に変換するのは非常に簡単です。低バイトのニブルをひっくり返し、他のすべてのバイトの高いニブルを取り除きます。
12345の数字を考えてみましょう - 詰め込まれた小数表では、x'12345c 'またはx'12345f'(cとfの両方が +、abとdは - )です。ゾーンデシマルに変換すると、低いニブルをひっくり返し、各桁の間に高いニブルに「F」を挿入しました。 x'f1f2ff3f4c5 'に変換します。
それを変換するには、プロセスを逆転させるだけです。 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を書き出さなければならなかったとは思いませんが、同じロジックを逆に使用すると思います。