将字节数组转换为二进制文件

时间:2017-08-22 15:23:01

标签: arrays vb6

更新 - 我在数据中添加了2个屏幕截图,其中一个数据为1234.56

我使用旧的VB6代码集,因为95%用于读取转换并存储在MS SQL中的文本文件。字符串都很好但是有些数字混合到文本二进制文件中,我还没有想出如何阅读。原始应用程序的数字都是货币,但数字的十六进制转储看起来是4字节数字。

无论哪种方式,我都不确定如何将数字读入局部变量。也许我没有从数据中的正确位置开始。在下面的示例中,我从< 160>开始。

以下是数据中 0.00 的二进制文件部分的转储:

enter image description here

以下是数据中 1234.56 的二进制文件部分的转储:

enter image description here

请注意,箭头指向数据更改的位置。

这是我的最后一次尝试但不起作用。

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

2 个答案:

答案 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可能也很有用,并且每次都看看字节的差异。

这也可以提供信息(相当深入):

http://www.codeguru.com/vb/gen/vb_misc/algorithms/article.php/c7495/How-Visual-Basic-6-Stores-Data.htm

要实际回答这个问题,以下内容将读取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