【问题标题】:Random Access to VB6 Binary Data from Java从 Java 随机访问 VB6 二进制数据
【发布时间】:2012-07-05 14:13:30
【问题描述】:

我正在尝试用 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个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 位,我当然需要这样做才能执行 56 位。

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

【问题讨论】:

  • 我只是想我应该补充一下,我知道这种事情之前已经在这个网站上处理过,我为类似的问题道歉,但到目前为止我的进展是由于其他问题,就像我一样问题中提到,我所做的不太正确,我不明白为什么。
  • 最好的解决方案是,如果已经存在执行此类操作的 Java 库但我找不到。
  • 我很乐意提供数据文件的样本,但由于它主要是空值和二进制文件,因此不适合发布。如果有地方可以分享二进制数据,请告诉我

标签: java vb6 vb6-migration random-access


【解决方案1】:

如果我尝试这样做,我想我会编写一个 VB6StreamReader,它封装了对 VB6 原语的读取,并处理数据中由于通过 Put in VB6 写入数据的方式而导致的数据中的怪癖。

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


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

【讨论】:

  • 感谢您的回答,我正在尝试为所有文件创建一个通用类,这就是为什么我说我最终可能会想要日期时间。但我在这里担心的是可能会丢失精度。如果 VB6 在 Java 眼中将 0.01 表示为 0.009999999776482582,那么四舍五入到几个 DP 可能还可以,但可以说我想将其增加到 0.07。我的直觉是,它可能看起来更像 0.069999999776482582 否则 VB6 可能会认为它是 0.070000000334628528 或者如果我继续来回写它,差异就会建立直到出现问题。
  • 字节 0,0,0,64,-31,122,-124,63 在 VB6 中给出 0.01 但 0.009999999776482582 使用我目前在 Java 中所拥有的,有什么区别,我该如何解释这正是我要问的
  • 我将您提到的字节(十六进制 00,00,00,40,E1,7A,84,3F)放入文件中,并在 VB6 中读取它们并输出到 MsgBox 并得到 .009999999977648258 .
  • 也许这就是我首先获取字节的方式,在 6 中我只是使用 get 进入自定义类型,我假设 Java 正确读取了字节,我会检查它。
  • 你确定VB6中的值就是你所说的吗?或者这只是显示的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多