代码之家  ›  专栏  ›  技术社区  ›  Mark Worsnop

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

  •  0
  • Mark Worsnop  · 技术社区  · 7 年前

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

    不管怎样,我都不知道如何将数字读入局部变量。也许我没有在数据中的正确位置开始。在下面的示例中,我从<160>。

    下面是二进制文件的一部分的转储,其中包含

    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 回复  |  直到 7 年前
        1
  •  1
  •   Guillermo Phillips    7 年前

    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

    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
    

    不需要中间字节数组。

        2
  •  0
  •   Proger_Cbsk    7 年前

    第一:将它们放入整数变量(键入Long)

    将其转换为单个的简单方法:

    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