Datasection füllen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
OR51
Beiträge: 10
Registriert: 25.08.2010 20:15

Datasection füllen?

Beitrag 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! :)
walter741
Beiträge: 68
Registriert: 26.10.2008 09:21
Computerausstattung: P4, 2600, 1,5GB Ram, XP SP3
Wohnort: Wien

Re: Datasection füllen?

Beitrag 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
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Datasection füllen?

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Datasection füllen?

Beitrag von HeX0R »

Ausserdem gab es so ein Tool schon.
Oder gleich ts-soft's PureDataConverter nehmen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Datasection füllen?

Beitrag 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
walter741
Beiträge: 68
Registriert: 26.10.2008 09:21
Computerausstattung: P4, 2600, 1,5GB Ram, XP SP3
Wohnort: Wien

Re: Datasection füllen?

Beitrag 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
Antworten