从Java随机访问VB6二进制数据

时间:2012-07-05 14:13:31

标签: java vb6 vb6-migration random-access

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

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

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

我还需要提取VB6数据类型Boolean,Double,Integer,Long和Single。最终我可能也需要日期时间,但不是第一阶段。要做双打我知道endianess是小端而不是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位,那么对于双Java抱怨,我当然需要这样做56.

对此的任何帮助都将非常感激

1 个答案:

答案 0 :(得分:0)

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

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


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