更新 - 我在数据中添加了2个屏幕截图,其中一个数据为1234.56
我使用旧的VB6代码集,因为95%用于读取转换并存储在MS SQL中的文本文件。字符串都很好但是有些数字混合到文本二进制文件中,我还没有想出如何阅读。原始应用程序的数字都是货币,但数字的十六进制转储看起来是4字节数字。
无论哪种方式,我都不确定如何将数字读入局部变量。也许我没有从数据中的正确位置开始。在下面的示例中,我从< 160>开始。
以下是数据中 0.00 的二进制文件部分的转储:
以下是数据中 1234.56 的二进制文件部分的转储:
请注意,箭头指向数据更改的位置。
这是我的最后一次尝试但不起作用。
Function ReadFloat(f As Integer, Optional ShowDB As Boolean = False) As String
On Error GoTo 0
Dim c As Single
Dim S(4) As Byte
Dim x As Integer
Dim flt As Single
Get f, , S
For x = 1 To 4
Debug.Print x & " " & S(x) & " " & Hex(S(x)); "='" & Chr(S(x)) & "'"
Next x
CopyMemory flt, S, 4
答案 0 :(得分:1)
我的初步检查表明字节开始:
40 E2 01
是您正在寻找的。这些存储的是小端,因此01E240是十六进制的123456的十六进制。所以我的猜测是32位整数(4字节长类型)。您可以使用-0.01作为值进行测试,这应该给出:
... FF FF FF FF ...
在文件中。
如果您只对阅读这些值感兴趣,那么您可以阅读并丢弃前x个值。类似的东西:
Dim yDiscard(123) As Byte
...
Get #1, ,yDiscard
或者,在阅读之前先找到位置:
Seek #1, 123
为了计算出一般的字节值,我发现以下内容很有用。只需在模块中运行代码:
Sub main()
Dim lValue As Long
Dim cValue As Currency
Dim nValue As Single
Dim dValue As Double
Dim sValue As String
Dim vValue As Variant
lValue = 123456
cValue = 1234.56
nValue = 1234.56
dValue = 1234.56
sValue = "1234.56"
vValue = CDec(1234.56)
Open "c:\test1.bin" For Binary As 1
Open "c:\test2.bin" For Binary As 2
Open "c:\test3.bin" For Binary As 3
Open "c:\test4.bin" For Binary As 4
Open "c:\test5.bin" For Binary As 5
Open "c:\test6.bin" For Binary As 6
Put #1, , lValue
Put #2, , cValue
Put #3, , nValue
Put #4, , dValue
Put #5, , sValue
Put #6, , vValue
Close #1
Close #2
Close #3
Close #4
Close #5
Close #6
End Sub
然后,您可以在十六进制编辑器中检查每个文件(我使用MadEdit,但任何事情都可以)。
尝试简单的值如1.00,2.00,10.00,-1.00可能也很有用,并且每次都看看字节的差异。
这也可以提供信息(相当深入):
要实际回答这个问题,以下内容将读取32位整数并转换为货币:
Function ReadAmount(iFileHandle As Integer, lFileBytePosition As Long) As Currency
Dim lValue As Long
Seek #iFileHandle, lFileBytePosition
Get #iFileHandle, , lValue
ReadAmount = CCur(lValue) / 100
End Function
不需要中间字节数组。
答案 1 :(得分:0)
使用货币时,真正的浮点数很差,所以实际上你的数字是一个固定点的整数。 第一:把它们放在一个整数变量中(类型为Long) 第二:除以100得到小数点!
将其转换为单一的简单方法:
Dim S(4) As Byte 'your 4 bytes, like (1)=&H40, (2)=&HE2 (3)=&H01, (4)=&H00
Dim Buffer As Long
Buffer = S(4) * 16777116 Or S(3) * 65536 Or S(2) * 256 Or S(1)
Dim flt As Single
flt = Buffer / 100