Seite 1 von 1

Datasection füllen?

Verfasst: 27.08.2010 21:41
von OR51
HI! :)
Ich habe den folgende Code gesehen: http://www.purebasic.fr/german/viewtopi ... =8&t=23103
In dem Code ganz unten gibt es ein Datasection Code.
Ich frage mich wie man die Daten einer Datei einfügt? :)
Muss man die gewünchte Datei mit einen Hex Editor starten und die Daten einzeln kopieren und einfügen oder geht es einfacher?
Danke im Vorraus! :)

Re: Datasection füllen?

Verfasst: 27.08.2010 22:00
von walter741
Hallo

Bin nur ein Anfänger und habe auch fast keine Ahnung.
Aber ich habe mir kurz ein Tool geschrieben, das ein Bild in mehrere
Data - Zeilen schreibt.

Funktionsweise:
Pfad zur Quelldatei eintragen. zB ein JPG Bild
Pfad zur Zieldatei eintragen . zB BlaBla.txt
Programm Starten.
In der Zieldatei die letzen beiden Zeichen (, und $) entfernen.
Text kopieren und in die eigene Anwendung kopieren.

Das der Code SCHEI.... ist weiß ich, deshalb nicht weitergeben oder sonst
wie in Umlauf bringen. :oops:

(Siehe meine vorige Frage)

Code: Alles auswählen


; Wandelt eine Datei ( Bild ) in mehrere Data-Zeilen
; Geschrieben und getestet mit PB 4.40 unter WinXP
                                                                              
OpenFile(1,"Quell_Datei")

OpenFile(2,"Zieldatei")
BlockProZeile = 8

While Eof(1) = 0

WriteString(2,"   Data.l")
     
     For c = 0 To BlockProZeile-1

          WriteString(2, " $")
               
                    If Eof(1) = 0
                         Zahl1 = ReadCharacter(1)
                         Zahl2 = ReadCharacter(1)
                         Zahl3 = ReadCharacter(1)
                         Zahl4 = ReadCharacter(1)
                    
                         If Zahl4 < 16
                              WriteString(2,"0" + Hex(Zahl4))
                         Else
                              WriteString(2,Hex(Zahl4))
                         EndIf
                         
                         
                         If Zahl3 < 16
                              WriteString(2,"0" + Hex(Zahl3))
                         Else
                              WriteString(2,Hex(Zahl3))
                         EndIf
                         
                         
                         If Zahl2 < 16
                              WriteString(2,"0" + Hex(Zahl2))
                         Else
                              WriteString(2,Hex(Zahl2))
                         EndIf

                   
                         If Zahl1 < 16
                              WriteString(2,"0" + Hex(Zahl1))
                         Else
                              WriteString(2,Hex(Zahl1))
                         EndIf
                    
                    
                    Else
                         Break(2)
                    EndIf
          
          If c < BlockProZeile-1
               WriteString(2, ",")
          EndIf
     
     Next c
          WriteString(2," " + Chr(13) + Chr(10))

Wend

CloseFile(1)
CloseFile(2)
End

lg walter

Re: Datasection füllen?

Verfasst: 27.08.2010 23:35
von Thorium
dieses hier:

Code: Alles auswählen

Zahl1 = ReadCharacter(1)
Zahl2 = ReadCharacter(1)
Zahl3 = ReadCharacter(1)
Zahl4 = ReadCharacter(1)
gegen das hier austauschen:

Code: Alles auswählen

Zahl4 = ReadCharacter(1)
Zahl3 = ReadCharacter(1)
Zahl2 = ReadCharacter(1)
Zahl1 = ReadCharacter(1)
Dann sollte die Byteorder auch richtig sein.
Du bringst die durcheinander, weil du die Daten als einzelne Bytes einliest, dann aber in einem Long (4 Bytes) ablegst. Intel Systeme verwendenden traditionell Little Endian Byteorder. Dabei wird die Reihenfolge der Bytes praktisch umgekehrt. Also das Long beginnt mit dem niederwertigsten Byte.

Re: Datasection füllen?

Verfasst: 27.08.2010 23:47
von HeX0R
Ausserdem gab es so ein Tool schon.
Oder gleich ts-soft's PureDataConverter nehmen.

Re: Datasection füllen?

Verfasst: 28.08.2010 00:13
von NicTheQuick
Ich hab das ganze mal etwas ausgebaut.

Die ersten zwei Zeilen sind Konfiguration. Dort kann man einstellen wie viele Werte pro Zeile stehen sollen und wie man seine Einrückung am liebsten hat, also ein echtes Tab oder mehrere Leerzeichen als String.

Nach dem Start muss man die Eingangsdatei auswählen, die man konvertieren möchte.
Danach kommt ein Requester, mit dem man die Datei festlegen kann, in die alles gespeichert werden soll. Drückt man hier auf Abbrechen, wird der erstellte Code in die Zwischenablage kopiert, damit man ihn einfach in schon bestehenden Code einfügen kann.

Ich habe das ganze nicht getestet, bin mir aber sicher, dass es funktionieren wird.

Hier also der Code dafür:

Code: Alles auswählen

#VALUES_PER_LINE = 8
#TAB_CHARS = Chr(9)

Define.s input, output

input = OpenFileRequester("Datei öffnen...", "", "", 0)
If Not input
	End 1
EndIf

output = SaveFileRequester("Speichern unter...", "", "", 0)

If Not ReadFile(1, input)
	MessageRequester("Fehler", "Kann Datei '" + input + "' nicht lesen.")
	End 1
EndIf

If output
	If Not ReadFile(1, "Quell_Datei")
		MessageRequester("Fehler", "Kann Datei '" + output + "' nicht zum Schreiben öffnen.")
		End 1
	EndIf
EndIf

Procedure.s filterChars(text.s)
	Protected *c.Character = @text
	Protected result.s, first.i = #True
	
	While *c\c
		If (*c\c >= '0' And *c\c <= '9' And Not first) Or *c\c = '_' Or (*c\c >= 'a' And *c\c <= 'z') Or (*c\c >= 'A' And *c\c <= 'Z')
			result + Chr(*c\c)
		Else
			result + "_"
		EndIf
		*c + SizeOf(Character)
	Wend
	
	ProcedureReturn result
EndProcedure

Define.s converted
Define.i i, fEnd = Lof(1) / 4

converted + "DataSection" + #CRLF$
converted + #TAB_CHARS + filterChars(GetFilePart(input)) + ":" + #CRLF$

Define.i columns
Define.l value

For i = 1 To fEnd

	value = ReadLong(1)
	
	If columns = 0
		converted + #TAB_CHARS + #TAB_CHARS + "Data.l "
	EndIf
	
	converted + "$" + RSet(Hex(value, #PB_Long), 8, "0")
	
	columns + 1
	
	If columns < #VALUES_PER_LINE And i < fEnd
		converted + ", "
	Else
		converted + #CRLF$
		columns = 0
	EndIf
Next

fEnd = Lof(1) % 4
For i = 1 To fEnd
	value = ReadAsciiCharacter(1)
	
	If columns = 0
		converted + #TAB_CHARS + #TAB_CHARS + "Data.a "
	EndIf
	
	converted + "$" + RSet(Hex(value, #PB_Ascii), 2, "0")
	
	columns + 1
	
	If columns < #VALUES_PER_LINE And i < fEnd
		converted + ", "
	Else
		converted + #CRLF$
		columns = 0
	EndIf
Next

CloseFile(1)

converted + #TAB_CHARS + filterChars(GetFilePart(input)) + "_END:" + #CRLF$
converted + "EndDataSection" + #CRLF$

If output
	WriteString(2, converted)
	CloseFile(2)
Else
	SetClipboardText(converted)
EndIf

End 0

Re: Datasection füllen?

Verfasst: 28.08.2010 10:23
von walter741
NicTheQuick

Danke für Dein " Ich hab das ganze mal etwas ausgebaut "

Das funktioniert wunderbar und ist deutlich funktioneller.

Jetzt kann ich meinen Code dort hin geben wo er hin gehört.

Getestet mit PB4.40 und XP

Danke