Datei binär einlesen

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance

From: Michael Windmeier (MeikelWausPDB_at_nurfuerspam.de)
Date: 03/07/04


Date: Sun, 07 Mar 2004 15:33:11 +0100

Hallo zusammen,

ich hoffe, mir kann hier jemand bei meinem kleinen Problem
weiterhelfen.

Das Unternehmen, bei dem ich beschäftigt bin, setzt VoiP ein. Die
eingesetzten Telefone besitzen einen lokalen Speicher für
Telefonnummern. Diesen Speicher kann man über das Netzwerk auslesen
und man bekommt eine sogenannte ETB Datei (ElektronischesTelefonBuch)
Diese Datei ist in einem eigenen Format kodiert.
Das Format habe ich analysiert und habe zum Auslesen für Klartext
folgende Funktion geschrieben (Kommentiert):

Sub ReadETBFile(ByVal sFilename As String) As String

  Dim ff As Integer, bChar As Byte
  Dim iI As Integer, iY As Integer, iCountBlock As Integer, iZLen As
Integer
  Dim iNextBlock As Integer
  Dim sRufnr() As String, sBezeichnung1() As String, sBezeichnung2()
As String
  Const kStartBlock = 217
  Const kBlock = 204

  ff = FreeFile()
  Open sFilename For Binary Access Read As #ff
  iCountBlock = 0 'Zähler für 3er Blöcke initialisieren
  iNextBlock = kStartBlock 'auf ersten Block setzen
  iI = 1 'Array-Zähler initialisieren
  Do While Not EOF(ff)
    Seek #ff, iNextBlock 'Position für Leseoperation setzen
    Get #ff, , bChar 'Hole Byte
    If Hex(bChar) = 22 Then 'Eintrag vorhanden
      ReDim Preserve sRufnr(iI) 'Rufnummer
      ReDim Preserve sBezeichnung1(iI) 'Nachname
      ReDim Preserve sBezeichnung2(iI) 'Vorname
      Seek #ff, iNextBlock + 10 'Position auf Rufnummerneintrag
      Get #ff, , bChar 'Hole Byte (Erste Position ist Längenangabe)
      iY = (bChar \ 2) + (bChar Mod 2) 'Länge gibt Nibbles an, also
Zähler umrechnen
      For iZLen = 1 To iY 'Hole Rufnummer
        Get #ff, , bChar
        sRufnr(iI) = sRufnr(iI) & CStr(Hex(bChar))
      Next iZLen
      Get #ff, , bChar 'Hole nächstes Byte, wieder Längenangabe
      If Hex(bChar) <> 0 Then 'Name vorhanden
        iY = bChar 'Länge in Zähler
        For iZLen = 1 To iY 'Hole Name
          Get #ff, , bChar
          sBezeichnung1(iI) = sBezeichnung1(iI) & Chr(CLng(bChar))
        Next iZLen
      End If
      Get #ff, , bChar 'Hole nächstes Byte
      If Hex(bChar) <> 0 Then 'weiterer Name vorhanden
        iY = bChar 'Länge in Zähler
        For iZLen = 1 To iY 'Hole weiteren Namen
          Get #ff, , bChar
          sBezeichnung2(iI) = sBezeichnung2(iI) & Chr(CLng(bChar))
        Next iZLen
        iNextBlock = Loc(ff) + 4 'Setze Position auf nächsten Eintrag
      Else
        iNextBlock = Loc(ff) + 5 'Setze Position auf nächsten Eintrag
      End If
      iI = iI + 1 'Arrayzähler erhöhen
    Else 'Kein weiterer Eintrag
      MsgBox "Keine weiteren Einträge vorhanden!", vbOKOnly, "Ende"
      Exit Do 'Verlasse Schleife
    End If
    If iI Mod 3 = 1 Then '3er Block abgearbeitet
      iCountBlock = iCountBlock + 1
      iNextBlock = kStartBlock + kBlock * iCountBlock 'auf nächsten
Block setzen
    End If
    
  Loop 'Ende des Files nicht erreicht, weiter
  
  Close #ff 'Schliesse File

End Sub

Hier nochmals kurz das Format im Klartext:
Die ersten 216 Byte beinhalten Zusatzinformationen.
Position 217 = Kennbyte, Hex 22 = Eintrag vorhanden
Position 217 + 10 = Längenangabe gespeicherte Rufnummer
Die Rufnummer ist im Klartext in den Hexwerten vorhanden und zwar so,
1. Beispiel: 04 66 21
Länge 4
Rufnummer = 6621
2. Beispiel 0D 00 52 51 69 36 68 7F
Länge D = 13
Rufnummer = 0 (<--Amtsholung) 05251 6936687
Das letzte Nibble ist nur zum Füllen und ist immer F
Hinter der Rufnummer kommt wieder ein Byte mit einer Längenangabe
z.B. 06 und dann 6 Byte in ASCII für Name, anschliessend optional
wieder eine Längenangabe und die entsprechenden Bytes ASCII für eine
weitere Bezeichnung. Abschluss sind 4 Füllbytes.

Das Problem:

Wenn die Rufnummer ausgelesen wird, holt die Funktion GET das Byte
immer als Dezimal. Ist der Inhalt Hex 00, bekomme ich 0
Ich brauche aber unbedingt beide Nullen.
Wie stelle ich das an?

Nun bin ich ganz Ohr oder besser Auge..;-)

Grüsse
Michael



Relevant Pages

  • Re: Datei binär einlesen
    ... >> Sub ReadETBFile(ByVal sFilename As String) As String ... >> Dim ff As Integer, ... Rechner speichern Daten in hexadezimaler ...
    (microsoft.public.de.vb)
  • Probleme mit Rename Funktion in VB
    ... Public Function GetOrdner() As String ... Dim DataAs String ... Dim Count As Integer = 0 ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Automatischer Zeilenumbruch
    ... Dim strString As String, intPos As Integer, intAnz As Integer ...
    (microsoft.public.de.access)
  • Re: Daten aus mehreren Registern und Dateien auslesen
    ... Private Const Orte As String = "DKNOSWFIGRES" ... Private Const Liste1 As String = "Utilization box capacity I.xls" ... Private ZielZeile As Integer ... Dim I As Integer ...
    (microsoft.public.de.excel)
  • Search pattern
    ... Dim strfile As String ... Dim bAddressFound As Boolean ... Dim strCurrentChar As String ...
    (comp.databases.ms-access)