Datei binär einlesen
From: Michael Windmeier (MeikelWausPDB_at_nurfuerspam.de)
Date: 03/07/04
- Next message: Arndt Fremler: "Visual Studio Installer 1.1"
- Previous message: Thorsten Albers: "Re: Api-File-Handle einer Datei ermitteln"
- Next in thread: Michael Windmeier: "Re: Datei binär einlesen"
- Reply: Michael Windmeier: "Re: Datei binär einlesen"
- Reply: Peter Götz: "Re: Datei binär einlesen"
- Messages sorted by: [ date ] [ thread ]
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
- Next message: Arndt Fremler: "Visual Studio Installer 1.1"
- Previous message: Thorsten Albers: "Re: Api-File-Handle einer Datei ermitteln"
- Next in thread: Michael Windmeier: "Re: Datei binär einlesen"
- Reply: Michael Windmeier: "Re: Datei binär einlesen"
- Reply: Peter Götz: "Re: Datei binär einlesen"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|