2

我正在尝试用 Java 编写分布式应用程序,但是我正在编写的程序正在替换 VB6 等效程序。使用的数据文件是包含使用 VB6 put 方法编写的二进制数据的实时文件,并且经常被多个应用程序使用。

通过将整条记录(160 字节)读入字节数组 buf,我已成功从文件中检索到文本。然后使用以下行提取文本字段

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

我还需要提取 VB6 数据类型 Boolean、Double、Integer、Long 和 Single。最终我可能也需要日期时间,但第一阶段不需要。要进行双打,我知道在 VB6 中字节序是小字节序而不是大字节序,所以我有以下功能

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

前几个数据字段是字符串,然后是 2 个双精度,此时的输出是:

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 位,我当然需要这样做才能执行 56 位,但是对于双 Java 会抱怨。

对此的任何帮助将不胜感激

4

1 回答 1

0

如果我尝试这样做,我想我会编写一个 VB6StreamReader,它封装了 VB6 原语的读取,并处理数据中的怪癖,这些怪癖是通过 VB6 中的 Put 写入数据的方式产生的。

关于舍入,大多数浮点数都以您描述的方式表示。您是否担心 VB6 以非标准方式对浮点数进行编码?Visual Basic 使用 IEEE 754。


有用的 IEEE-754 计算器: http ://babbage.cs.qc.cuny.edu/IEEE-754/

于 2012-07-05T14:42:30.117 回答