 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Stephan666
Anmeldungsdatum: 24.01.2008 Beiträge: 2
|
Verfasst am: 24.01.2008, 21:41 Titel: Offset und Länge aus Binärdatei auslesen |
|
|
Moin Moin,
evtl. könnt ihr mir helfen, ich muß aus einer Binärdatei 8 Bytes auslesen (ist ja kein Problem) und dann die Bytes drehen (aus ABCDEFGH wird dann HGFEDCBA), die letzten 4 Bytes enthalten die Startposition eines bestimmten Bereichs innerhalb der Datei, die letzten 4 die Länge, ich habe das jetzt etwas unelegant gelöst indem ich jedes Byte in HEX umwandel, dann drehe und dann in Dezimal umrechne, hat einer ne Idee wie ich das besser machen kann?
Code: |
b$="ABCDEFGH"
FOR a = 4 TO 1 STEP -1
a$ = HEX$(ASC(MID$(b$, a, 1)))
IF LEN(a$) = 1 THEN a$ = "0" + a$
length$ = length$ + a$
a$ = HEX$(ASC(MID$(b$, a + 4, 1)))
IF LEN(a$) = 1 THEN a$ = "0" + a$
position$ = position$ + a$
NEXT
position$ = "&h" + position$ + "&"
length$ = "&h" + length$ + "&"
position = VAL(position$)
length = VAL(length$)
PRINT " Position at byte "; position;" ";position$; " and length is "; length;" ";length$
|
Schönen Abend Gruß
Stephan:-) |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 25.01.2008, 03:48 Titel: |
|
|
Hallo
Wenn ich das richtig verstanden habe, dann kannst du einfach direkt zwei Doppelworte aus der Binädatei auslesen anstelle der zwei Mal vier Byte.
Code: | OPEN "datei.dat" FOR BINARY AS #1
GET#1, x, position&
GET#1, x + 4, length&
CLOSE #1
PRINT position&
PRINT length& |
x ist dabei die Position des ersten der acht Byte, die Du auslesen willst, Das &-Zeichen zeigt an, dass es sich um 32-Bit Ganzahlvariable handelt. Da passen die vier Byte genau rein und "umgedreht" werden sie auch automatisch.
Ach ja, herzlich willkommen im Forum!
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 25.01.2008, 11:14 Titel: |
|
|
Jetzt muss ich mich auch mal wieder zu Wort melden, bevor die Admins auf die Idee komen, meinen Nick zu löschen...
@Skilltronic
Wenn ich Stephan richtig verstanden habe, liefert dein Lösungsansatz nicht das richtige Ergebnis.
Hier ein Testbeispiel, in dem ich deine Lösungsvariante meiner Lösungsvariante gegenübergestellt habe:
Code: | TYPE typBytes
Bytes(1 TO 8) AS STRING * 1
END TYPE
DIM uBytes AS typBytes
TYPE typResult
lPosition AS LONG
lLength AS LONG
END TYPE
DIM uResult AS typResult
CLS
'Testwerte schreiben
lDataPos& = 50
lTestPos& = &H11223344
lTestLen& = &H55667788
PRINT "TESTWERTE"
PRINT " Position at byte"; lDataPos&; "is ";
PRINT HEX$(lTestPos&);
PRINT " and length is ";
PRINT HEX$(lTestLen&)
OPEN "TEST.DAT" FOR BINARY AS #1
PUT #1, lDataPos&, lTestPos&
PUT #1, , lTestLen&
CLOSE #1
'Loesung Skilltronic
PRINT
PRINT "LOESUNG SKILLTRONIC"
OPEN "TEST.DAT" FOR BINARY AS #1
x& = LOF(1) - 7
GET #1, x&, position&
GET #1, x& + 4, length&
CLOSE #1
PRINT " Position at byte"; x&; "is ";
PRINT HEX$(position&);
PRINT " and length is ";
PRINT HEX$(length&)
'Loesung pinkpanther
PRINT
PRINT "LOESUNG PINKPANTHER"
OPEN "TEST.DAT" FOR BINARY AS #1
lDataPos& = LOF(1) - 7
GET #1, lDataPos&, uBytes
CLOSE #1
FOR i% = 1 TO 4
SWAP uBytes.Bytes(i%), uBytes.Bytes(9 - i%)
NEXT
LSET uResult = uBytes
PRINT " Position at byte"; lDataPos&; "is ";
PRINT HEX$(uResult.lPosition);
PRINT " and length is ";
PRINT HEX$(uResult.lLength) |
Schönen Tag noch! _________________ lG
pinkpanther  |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 25.01.2008, 14:30 Titel: |
|
|
Hallo
pinkpanther hat Folgendes geschrieben: |
@Skilltronic
Wenn ich Stephan richtig verstanden habe, liefert dein Lösungsansatz nicht das richtige Ergebnis.
Hier ein Testbeispiel, in dem ich deine Lösungsvariante meiner Lösungsvariante gegenübergestellt habe(...) |
Also wenn ich meine Lösungsvariante der von Stephan666 gegenüberstelle, liefern beide zumindest das gleiche Ergebnis. Ob das das richtige ist, weiß ich nicht.
Code: | CLS
DIM byte AS STRING * 1
anfang = 1 'Startposition der 8 Byte in der Datei
OPEN "datei.dat" FOR BINARY AS #1 'ABCDEFGH in die Datei schreiben
FOR z = anfang TO anfang + 7
byte = CHR$(64 + z)
PUT #1, z, byte
NEXT
PRINT
CLOSE #1
b$ = ""
OPEN "datei.dat" FOR BINARY AS #1
FOR z = anfang TO anfang + 7
GET #1, z, byte
b$ = b$ + byte
NEXT
CLOSE #1
PRINT b$
PRINT "Loesung Stephan666"
FOR a = 4 TO 1 STEP -1
a$ = HEX$(ASC(MID$(b$, a, 1)))
IF LEN(a$) = 1 THEN a$ = "0" + a$
length$ = length$ + a$
a$ = HEX$(ASC(MID$(b$, a + 4, 1)))
IF LEN(a$) = 1 THEN a$ = "0" + a$
position$ = position$ + a$
NEXT
position$ = "&h" + position$ + "&"
length$ = "&h" + length$ + "&"
position& = VAL(position$)
length& = VAL(length$)
PRINT " Position at byte "; position&; " "; position$;
PRINT " and length is "; length&; length$
PRINT "Loesung Skilltronic"
OPEN "datei.dat" FOR BINARY AS #1
GET #1, anfang, length&
GET #1, anfang + 4, position&
CLOSE #1
PRINT " Position at byte "; position&; " &h"; HEX$(position&);
PRINT "& and length is "; length&; "&h"; HEX$(length&); "&"
|
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 25.01.2008, 19:17 Titel: |
|
|
@Skilltronic
Warum du & ich zu unterschiedlichen Ergebnissen kommen...
Der Schlüssel liegt darin, dass die zu speichernden/verarbeitenden/lesenden Werte laut Angabe numerisch sind (Position und Länge) - die Buchstaben in den Ausdrücken "ABCDEFGH" bzw. "HGFEDCBA" dienen ja nur dazu, die Aufgabe anschaulich darzustellen - Stephan und du aber mit Zeichen arbeiten.
In der Datei werden Zahlenwerte byteweise "verkehrt" abgelegt - aus den Zahlenwerten &H11223344& und &H55667788& wird also die Bytefolge 88 77 66 55 44 33 22 11 (hex), wogegen die Reihenfolge der Zeichen "ABCDEFGH" auch in der Datei gleich bleibt.
Daher wird "euer" ausgelesenes Ergebnis auch nicht "gedreht"...
Hab ich da einen Denkfehler?
Code: | CLS
DIM byte AS STRING * 1
'Aufgabe laut Stephan:
' "ich muss aus einer Binaerdatei 8 Bytes auslesen ...
' und dann die Bytes drehen (aus ABCDEFGH wird
' dann HGFEDCBA), die letzten 4 Bytes enthalten die
' Startposition eines bestimmten Bereichs innerhalb
' der Datei, die letzten 4 die Laenge, ..."
' --> die zu speichernden/ermittelnden Werte sind
' also numerisch!
'
'Ausgangswerte fuer den Test:
' Position Laenge
' A B C D E F G H
' &H11223344 &H55667788
'
'erwartetes Ergebnis:
' Position Laenge
' H G F E D C B A
' &H88776655 &H44332211
origpos& = &H11223344
origlaenge& = &H55667788
erwartpos& = &H88776655
erwartlaenge& = &H44332211
PRINT "AUSGANGSWERTE"
PRINT " Laenge : &h" + HEX$(origlaenge&) + "&"
PRINT " Position: &h" + HEX$(origpos&) + "&"
PRINT
PRINT "ERWARTETES ERGEBNIS"
PRINT " Laenge : &h" + HEX$(erwartlaenge&) + "&"
PRINT " Position: &h" + HEX$(erwartpos&) + "&"
PRINT
anfang = 1 'Startposition der 8 Byte in der Datei
OPEN "datei.dat" FOR BINARY AS #1
z = anfang
PUT #1, z, origlaenge&
PUT #1, z + 4, origpos&
CLOSE #1
b$ = ""
OPEN "datei.dat" FOR BINARY AS #1
FOR z = anfang TO anfang + 7
GET #1, z, byte
b$ = b$ + byte
NEXT
CLOSE #1
PRINT "Loesung Stephan666"
FOR a = 4 TO 1 STEP -1
a$ = HEX$(ASC(MID$(b$, a, 1)))
IF LEN(a$) = 1 THEN a$ = "0" + a$
length$ = length$ + a$
a$ = HEX$(ASC(MID$(b$, a + 4, 1)))
IF LEN(a$) = 1 THEN a$ = "0" + a$
position$ = position$ + a$
NEXT
position$ = "&h" + position$ + "&"
length$ = "&h" + length$ + "&"
position& = VAL(position$)
length& = VAL(length$)
PRINT " Position at byte"; anfang; ": "; position$;
PRINT " and length is "; length$
PRINT
PRINT "Loesung Skilltronic"
OPEN "datei.dat" FOR BINARY AS #1
GET #1, anfang, length&
GET #1, anfang + 4, position&
CLOSE #1
PRINT " Position at byte"; anfang; ": &h"; HEX$(position&);
PRINT "& and length is &h"; HEX$(length&); "&" |
_________________ lG
pinkpanther  |
|
Nach oben |
|
 |
Stephan666
Anmeldungsdatum: 24.01.2008 Beiträge: 2
|
Verfasst am: 25.01.2008, 21:14 Titel: |
|
|
Moin Moin,
...wau, dankeschön das Ihr euch solche Mühe macht, ich versuche einfach nur folgendes umzusetzen (Bilder sagen mehr als Worte hoffe ich, wenn ihr es genau wissen möchtet, ich möchte in ein Handyfirmwarefile eine Datei gegen eine andere austauschen, klappt sogar schon.)
AB 01 00 00 BC 9E 00 00 FF 09
AB 01 00 00 = 00 00 01 AB = 427 byte (dimensione del file snack.ini)
BC 9E 00 00 = 00 00 9E BC offset (indirizzo) di inizio del file snack.ini
Mit der Lösung von Skilltronic komme ich glaube ich am kürzesten ans Ziel:-)
Vielen vielen Dank & ein schönes Wochenende wünscht euer
Stephan:-) |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 26.01.2008, 00:45 Titel: |
|
|
Hallo
pinkpanther hat Folgendes geschrieben: | @Skilltronic
Warum du & ich zu unterschiedlichen Ergebnissen kommen...
Der Schlüssel liegt darin, dass die zu speichernden/verarbeitenden/lesenden Werte laut Angabe numerisch sind (Position und Länge) - die Buchstaben in den Ausdrücken "ABCDEFGH" bzw. "HGFEDCBA" dienen ja nur dazu, die Aufgabe anschaulich darzustellen - Stephan und du aber mit Zeichen arbeiten. |
Aber ein Byte ist ein Byte ist ein Byte. Egal, ob ich da ein Zeichen oder ne Zahl hineininterpretiere, es bleibt eine Folge von acht Bit.
pinkpanther hat Folgendes geschrieben: | In der Datei werden Zahlenwerte byteweise "verkehrt" abgelegt - aus den Zahlenwerten &H11223344& und &H55667788& wird also die Bytefolge 88 77 66 55 44 33 22 11 (hex), wogegen die Reihenfolge der Zeichen "ABCDEFGH" auch in der Datei gleich bleibt.
Daher wird "euer" ausgelesenes Ergebnis auch nicht "gedreht"...
Hab ich da einen Denkfehler? |
Nicht unbedingt einen Denkfehler, eher ein Missverständnis. Stephan666 hat das mit dem Drehen etwas komisch erklärt. Es geht mehr ums Zurückdrehen statt um das Drehen der Bytes. Mir kam die Frage z.B. vom Einlesen von Bitmap-Dateien bekannt vor und scheinbar funktioniert es ja auch, wenn er einfach ein Doppelwort liest.
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|