Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Offset und Länge aus Binärdatei auslesen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Stephan666



Anmeldungsdatum: 24.01.2008
Beiträge: 2

BeitragVerfasst am: 24.01.2008, 21:41    Titel: Offset und Länge aus Binärdatei auslesen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 25.01.2008, 03:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 25.01.2008, 11:14    Titel: Antworten mit Zitat

Jetzt muss ich mich auch mal wieder zu Wort melden, bevor die Admins auf die Idee komen, meinen Nick zu löschen... grinsen

@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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 25.01.2008, 14:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 25.01.2008, 19:17    Titel: Antworten mit Zitat

@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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Stephan666



Anmeldungsdatum: 24.01.2008
Beiträge: 2

BeitragVerfasst am: 25.01.2008, 21:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 26.01.2008, 00:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz