質問

コンプフィールドの変換について質問しましたが、それについては答えが得られませんでした。

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を書き出さなければならなかったとは思いませんが、同じロジックを逆に使用すると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top