2012-07-05 33 views
2

我正在嘗試用Java寫一個分佈式應用程序,但是我正在編寫的程序正在取代一個VB6等價物。所使用的數據文件是包含使用VB6 put方法編寫的二進制數據的實時文件,並且它們一直由多個應用程序使用。從Java隨機訪問VB6二進制數據

我已通過將整個記錄(160字節)讀入字節數組buf中,從文件中成功檢索到文本。然後使用以下行以提取文本字段

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

我還需要提取VB6數據類型布爾人,雙人,整型,長和單。最終我可能還需要日期時間,但不是第一階段。要做到雙打我知道字節序是小端,而不是大的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,如果我圍繞它,則是正確的,但是,答:我對價格和增值稅信息和B進行四捨五入。我無法合理地將任何更改回寫到文件就好像我正在閱讀時有餘量或錯誤,那麼我可能會寫入相同的錯誤邊界。我也試過手動位移位,而對於雙Java的,如果我試圖轉移超過31位,當然我需要爲了做56

任何幫助將是非常讚賞

+0

我只是想我要補充,我知道這樣的事情之前該網站已被處理了,我的道歉類似的問題,但我迄今爲止的進展是由於其他問題,如我在問題中提到的,我所做的不完全正確,我不明白爲什麼。 – feldoh 2012-07-05 14:19:34

+0

如果一個Java庫做這種事情已經存在,但我找不到一個最好的解決方案。 – feldoh 2012-07-05 14:20:29

+0

我很想給出一個數據文件的樣本,但是因爲它大部分是空值和二進制的,所以它並不完全適合發佈。如果有一個地方我可以分享二進制數據,請讓我知道 – feldoh 2012-07-05 14:23:14

回答

0

抱怨如果我正在嘗試這樣做,我想我會寫一個VB6StreamReader來封裝VB6原語的讀取,並處理數據中的怪癖,這些怪癖是通過Put在VB6中寫入數據的方式產生的。

關於四捨五入,大多數浮點數都以您描述的方式表示。你是否擔心VB6以非標準的方式編碼浮點數? Visual Basic使用的IEEE 754


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

+0

感謝您的答案,我試圖做一個普通班,爲所有文件做這就是爲什麼我說我可能會最終希望datetime。但是這裏關心的是可能的精度損失。如果在Java中,VB6表示0.01爲0.009999999776482582,那麼舍入到幾個DP可能是好的,但可以說我想增加到0.07。我的直覺是,它可能應該看起來更像0.069999999776482582,否則VB6可能會認爲它0.070000000334628528或者如果我一直寫它的差異將建立,直到問題。 – feldoh 2012-07-05 15:17:40

+0

字節0,0,0,64,-31,122,-124,63在VB6中給出0.01但爲0。009999999776482582使用我到目前爲止在Java中有什麼區別,我怎麼解釋它更精確的是我所要求的 – feldoh 2012-07-05 15:19:58

+0

我放置了你提到的字節(十六進制00,00,00,40,E1,7A,84 ,3F)寫入一個文件並在VB6中讀取並輸出到一個MsgBox並得到.00999999977648258。 – tcarvin 2012-07-05 15:49:13