从二进制文件中读取和写作



我想读写一个lowrance .usr文件。这是一个具有特定数据结构的二进制文件,我已经设法解码了,并在Visual Basic中编写了一个必要的阅读和写作程序。我正在将此软件迁移到我的Android手机。

我在VB中定义的结构是:

   Public Structure WAYPOINT
    Public wWaypointNum As Integer
    Public dwLatitudeMM As Long
    Public dwLongitudeMM As Long
    Public dwAltitudeFT As Long
    Public dwWaypointNmLength As Long
    Public abWaypointName As Char()
    Public wWaypointDescLength As Long
    Public abWaypointDescription As Char()
    Public dwWaypointTime As Long
    Public dwWaypointSymbol As Long
    Public wWaypointStatus As Integer
End Structure

然后使用以下代码读取文件:

   Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click
    Dim i As Integer
    Dim objBR As BinaryReader
    Dim objFS As FileStream
    Dim objWP As New WAYPOINT
    Dim objwVer As Integer
    Dim objwSVer As Integer
    Dim objNoWaypoints As Integer
    Dim objNoRoutes As Integer
    Dim TempLat As Double
    Dim TempLng As Double
    Dim LatString As String
    Dim LngString As String
    objFS = New FileStream("c:BinaryBinary FileBinary Filewaverider.usr", FileMode.Open)
    objBR = New BinaryReader(objFS)
    objBR.BaseStream.Seek(0, SeekOrigin.Begin)
    objwVer = objBR.ReadInt16
    objwSVer = objBR.ReadInt16
    objNoWaypoints = objBR.ReadInt16
    For i = 1 To objNoWaypoints
        objWP = Nothing
        With objWP
            .wWaypointNum = objBR.ReadInt16
            .dwLatitudeMM = objBR.ReadInt32
            .dwLongitudeMM = objBR.ReadInt32
            .dwAltitudeFT = objBR.ReadInt32
            .dwWaypointNmLength = objBR.ReadInt32
            .abWaypointName = objBR.ReadChars(.dwWaypointNmLength)
            .wWaypointDescLength = objBR.ReadInt32
            .abWaypointDescription = objBR.ReadChars(.wWaypointDescLength)
            .dwWaypointTime = objBR.ReadInt32
            .dwWaypointSymbol = objBR.ReadInt32
            .wWaypointStatus = objBR.ReadInt16
        End With
        TempLat = objWP.dwLatitudeMM / EarthRad
        TempLat = Math.Exp(TempLat)
        TempLat = (2 * Math.Atan(TempLat)) - (Math.PI / 2)
        TempLat = TempLat * RadToDeg
        LatString = DegToDecMin(TempLat, "Lat")
        TempLng = objWP.dwLongitudeMM / EarthRad
        TempLng = Math.Exp(TempLng)
        TempLng = (2 * Math.Atan(TempLng)) - (Math.PI / 2)
        TempLng = TempLng * RadToDeg
        LngString = DegToDecMin(TempLng, "Lng")
        With lvWaypoints
            Dim lv As ListViewItem = .Items.Add(objWP.abWaypointName)
            With lv
                .SubItems.Add(objWP.abWaypointDescription)
                .SubItems.Add(LatString)
                .SubItems.Add(LngString)
            End With
        End With
    Next i
    '\ Read Routes
    'objNoRoutes = objBR.ReadInt16 'Number of Routes
End Sub

然后将数据解码:

   Public Function DegToDecMin(ByVal DecDeg As Double, ByVal LatLng As String) As String
    Dim ReturnValue As String
    Dim Pos As String
    If LatLng = "Lat" Then
        If DecDeg < 0 Then Pos = "S" Else Pos = "N"
    Else
        If DecDeg < 0 Then Pos = "W" Else Pos = "E"
    End If
    Dim mDeg As Double = Math.Abs(DecDeg)
    Dim mWholeDeg As Double = Math.Truncate(mDeg)
    Dim mRemDegS As String = String.Format("{0:##.000}", (mDeg - mWholeDeg) * 60)
    If InStr(mRemDegS, ".") = 2 Then mRemDegS = "0" & mRemDegS
    If InStr(mRemDegS, ".") = 1 Then mRemDegS = "00" & mRemDegS
    ReturnValue = mWholeDeg.ToString & Chr(176) & mRemDegS & "'" & Pos
    Return ReturnValue
End Function

Java中是否有类似的功能可以实现相同的目标

对于java,只有语法是根据java语法更改的,

首先,您需要创建一个像下面的bean文件,

public class WayPoint
{
    public int wWaypointNum;
    public int dwLatitudeMM;
    public dwLongitudeMM;
    ...
}

第二,您需要文件API才能读取和从文件中读写。为此,您可以使用文件,fileInputStream,fileOutputStream,datainputstream,dataoutputstream。

最新更新