  | 
					
						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, 20: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, 02: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, 10: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, 13: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, 18: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, 20: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: 25.01.2008, 23: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.
  | 
   
 
     |