2

Java で分散アプリケーションを作成しようとしていますが、作成中のプログラムは VB6 に相当するものを置き換えています。使用されるデータ ファイルは、VB6 の put メソッドを使用して記述されたバイナリ データを含むライブ ファイルであり、いくつかのアプリケーションで常に使用されています。

レコード全体 (160 バイト) をバイト配列 buf に読み込むことで、ファイルからテキストを正常に取得できました。次に、次の行を使用してテキスト フィールドを抽出します

new String(Arrays.copyOfRange(buf, 15, 40), "ISO-8859-1");

また、VB6 データ型の Boolean、Double、Integer、Long、Single を抽出する必要があります。最終的にはおそらくdatetimeも必要になるでしょうが、最初の段階では必要ありません。ダブルスを行うには、エンディアンがVB6ではビッグではなくリトルエンディアンであることを知っているので、次の関数があります

public static double toDouble(byte[] bytes) {
    return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getDouble();
}

最初のいくつかのデータ フィールドは文字列で、次に 2 つの double です。現時点での出力は次のとおりです。

Barcode: 1            
Dept Code: 18
Description: MISC NON VAT             
Trade Price: 0.0
Retail Price: 0.009999999776482582

ご覧のとおり、最初の 3 つは論理的であり、データファイルの内容と一致します。取引価格は 0.0 である必要があるので問題ありませんが、小売価格は 0.01 である必要があり、四捨五入すると正しいのですが、A. 価格と付加価値税の情報を四捨五入するのが苦手であり、B. 変更を合理的に書き戻すことができませんファイルをマージンまたはエラーで読んでいるかのように、おそらく同じマージンで書き込みます。また、手動でビットシフトを試みましたが、31 ビットを超えてシフトしようとすると、Java が二重に文句を言います。これはもちろん、56 を行うために必要です。

これに関する任意の助けをいただければ幸いです

4

1 に答える 1

0

私がこれを行おうとしている場合、VB6 プリミティブの読み取りをカプセル化し、データが VB6 の Put を介して書き込まれる方法に起因するデータの癖を処理する VB6StreamReader を作成すると思います。

丸めに関しては、ほとんどの浮動小数点数はあなたが説明した方法で表されます。VB6 が非標準の方法で浮動小数点数をエンコードすることを懸念していますか? Visual Basic は IEEE 754 を使用します。


便利な IEEE-754 電卓: http://babbage.cs.qc.cuny.edu/IEEE-754/

于 2012-07-05T14:42:30.117 に答える