Chr(0) in String verketten und in File schreiben
-
- Beiträge: 23
- Registriert: 14.12.2018 23:01
Chr(0) in String verketten und in File schreiben
Hallo!
Ich bekomme Daten aus der DB2 Datenbank beim Datentype BLOB (Binary Large Object) in Hexadezimal
Darstellung zurück. Dieser lange Hex String enthält auch den Hex Wert 00. Dieser ist nach ASCII konvertiert
chr(0). Wenn ich nun versuche, diese Hex Werte nach ASCII zu konvertieren, wird hex(00) nicht nach
ASCII konvertiert, da PB dieses Zeichen gesondert behandelt. Alle anderen Zeichen scheinen zu funktionieren.
Hat jemand eine Lösung für dieses Problem? Bei den Daten handelt es sich z.B. um JPG Bilder, die in der
Datenbank gespeichert sind. Mit einem Java Programm bekomme ich den Hex String richtig konvertiert, so
dass das Bild auch angezeigt wird.
Jörg Burdorf
Ich bekomme Daten aus der DB2 Datenbank beim Datentype BLOB (Binary Large Object) in Hexadezimal
Darstellung zurück. Dieser lange Hex String enthält auch den Hex Wert 00. Dieser ist nach ASCII konvertiert
chr(0). Wenn ich nun versuche, diese Hex Werte nach ASCII zu konvertieren, wird hex(00) nicht nach
ASCII konvertiert, da PB dieses Zeichen gesondert behandelt. Alle anderen Zeichen scheinen zu funktionieren.
Hat jemand eine Lösung für dieses Problem? Bei den Daten handelt es sich z.B. um JPG Bilder, die in der
Datenbank gespeichert sind. Mit einem Java Programm bekomme ich den Hex String richtig konvertiert, so
dass das Bild auch angezeigt wird.
Jörg Burdorf
Re: Chr(0) in String verketten und in File schreiben
Base64Encoder ist hier das Stichwort.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
Re: Chr(0) in String verketten und in File schreiben
Wenn es ein binärer Inhalt ist, darfst du nicht nach String konvertieren. Erstelle dafür einen Speicher mit AllocateMemory().
Wenn du den binären Inhalt z.B. auf die Festplatte speichern möchtest, dann mit WriteData().
In der PB-Hilfe unter WriteData() gibt es ein Beispielcode, wie du einen Speicher allokieren und Speicherinhalt binär speichern kannst.
Wenn du den binären Inhalt z.B. auf die Festplatte speichern möchtest, dann mit WriteData().
In der PB-Hilfe unter WriteData() gibt es ein Beispielcode, wie du einen Speicher allokieren und Speicherinhalt binär speichern kannst.
-
- Beiträge: 23
- Registriert: 14.12.2018 23:01
Re: Chr(0) in String verketten und in File schreiben
Hallo zusammen!
Der Datenstrom von der Datenbank ist in HEX. Hier ein Ausschnitt:
FFD8FFE000104A46494600010101006400640000FFDB00430006040506050406060506070706080A100A0A[...]
Wie gesagt, nur ein Ausschnitt.
2 Zeichen ergeben ein ASCII Zeichen, kann ich mit VAL($,zweizeichen$) in eine Integer zwischen 0 und 255
umwandeln, bis auf die x'00' wie hier z.B. am Anfang des Strings:
FFD8FFE000
FF D8 FF E0 00
alles tut bis auf 00.
LG
__________________________________________________
Hex-String gekürzt
28.05.2019
RSBasic
Der Datenstrom von der Datenbank ist in HEX. Hier ein Ausschnitt:
FFD8FFE000104A46494600010101006400640000FFDB00430006040506050406060506070706080A100A0A[...]
Wie gesagt, nur ein Ausschnitt.
2 Zeichen ergeben ein ASCII Zeichen, kann ich mit VAL($,zweizeichen$) in eine Integer zwischen 0 und 255
umwandeln, bis auf die x'00' wie hier z.B. am Anfang des Strings:
FFD8FFE000
FF D8 FF E0 00
alles tut bis auf 00.
LG
__________________________________________________
Hex-String gekürzt
28.05.2019
RSBasic
- HeX0R
- Beiträge: 2959
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 - Kontaktdaten:
Re: Chr(0) in String verketten und in File schreiben
Die 0 "tut" auch, wenn Du das machen würdest, was RSBasic gesagt hat.
Und bitte denke auch an die Tablet User, bevor du nen irre langen String hier postest!
Und bitte denke auch an die Tablet User, bevor du nen irre langen String hier postest!
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}
Re: Chr(0) in String verketten und in File schreiben
Nimm 2 Character des Strings und vergleiche sie mit einem Lookup Table mit allen Hex Charactern von 0 - 255 sortiert.
Das resultierende Ergebnis ist der Ascii/Byte Wert.
So kann man den geposteten String wieder in ein Bild umwandeln (zumindest soweit vorhanden):
Das resultierende Ergebnis ist der Ascii/Byte Wert.
So kann man den geposteten String wieder in ein Bild umwandeln (zumindest soweit vorhanden):
-
- Beiträge: 68
- Registriert: 26.04.2019 10:31
- Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
- Wohnort: Mühldorf am Inn
Re: Chr(0) in String verketten und in File schreiben
Dazu hätt ich jetzt eine Frage:
Nachdem die Daten eh schon in Hex vorliegen, sollte es doch möglich sein eine jpg Datei zu erzeugen
und die binären Daten in das File zu schreiben?
Schöne Grüsse
Kurt
Nachdem die Daten eh schon in Hex vorliegen, sollte es doch möglich sein eine jpg Datei zu erzeugen
und die binären Daten in das File zu schreiben?
Schöne Grüsse
Kurt
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
- TroaX
- Beiträge: 661
- Registriert: 08.03.2013 14:27
- Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
- Wohnort: NRW
- Kontaktdaten:
Re: Chr(0) in String verketten und in File schreiben
Seit wann sind 2 Hex-Stellen bitte ein ASCII Zeichen. Es handelt sich dabei um das hexadezimale Zahlensystem, bei denen 2 Zeichen ein Byte ergeben. Das einzige, was wirklich Sinn macht wäre, wenn du ein Päärchen in die Zahl konvertierst und diese in eine Variable des Typs ASCII schreibst.
Normalerweise sollte in der Variable Zahl im folgendem Beispiel 0 stehen:
Wenn das der Fall ist (wovon auszugehen ist), ist bis hier hin alles korrekt. Wenn du jetzt aber die Bytes verwendest, um jedes Byte in ein ASCII/Unicode Zeichen in ein String zu schreiben, wird das nur bis zur Doppelnull gehen. Denn ein Null-Byte ist ein Stringlimiter. Der String wird an der Stelle beendet.
Wenn du also aus dem Hex-String die Ursprungsdaten herstellen willst, dann musst du das über den Speicher erledigen. Und wenn du den MIME-Type der Daten kennst, musst du dann nur noch die Daten passend speichern bzw. weiterverarbeiten.
Normalerweise sollte in der Variable Zahl im folgendem Beispiel 0 stehen:
Code: Alles auswählen
Define Zahl.a, Hex.s
Hex = "00"
Zahl = Val("$" + Hex)
Debug Zahl
Wenn du also aus dem Hex-String die Ursprungsdaten herstellen willst, dann musst du das über den Speicher erledigen. Und wenn du den MIME-Type der Daten kennst, musst du dann nur noch die Daten passend speichern bzw. weiterverarbeiten.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
-
- Beiträge: 68
- Registriert: 26.04.2019 10:31
- Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
- Wohnort: Mühldorf am Inn
Re: Chr(0) in String verketten und in File schreiben
Hallo,
nachdem mir das keine Ruhe gelassen hat, hab ich hier einen Lösungsvorschlag:
Das Programm erzeugt einen Hexstring nach dem Muster von Jörg und
wandelt ihn wieder in eine Binärdatei um.
Fällt mir grade eine kleine Gemeinheit dazu ein, wer das nicht kennt wird sich an
einem solchen Programmschutz bestimmt die Zähne ausbeissen.
Auf diese Weise kann man sämtliche Dateien "verstecken" und erst zur
Laufzeit zur Verfügung stellen...
nachdem mir das keine Ruhe gelassen hat, hab ich hier einen Lösungsvorschlag:
Das Programm erzeugt einen Hexstring nach dem Muster von Jörg und
wandelt ihn wieder in eine Binärdatei um.
Fällt mir grade eine kleine Gemeinheit dazu ein, wer das nicht kennt wird sich an
einem solchen Programmschutz bestimmt die Zähne ausbeissen.
Auf diese Weise kann man sämtliche Dateien "verstecken" und erst zur
Laufzeit zur Verfügung stellen...
Code: Alles auswählen
; Zuerst wird hier eine Dummy Binärdatei erzeugt
If CreateFile(0, "/home/internet/Demo.bin") ; Neue Binärdatei erstellen
For i=0 To 255
WriteByte (0, i)
Next
CloseFile(0)
Else
MessageRequester("Fehler","Die Binär Datei konnte nicht erstellt werden!")
EndIf
; Hier wird die Binärdatei byteweise ausgelesen, in einen HexString umgewandelt und abgespeichert
HexString$=""
LeseFile$ = "/home/internet/Demo.bin"
If LeseFile$
If ReadFile(0, LeseFile$)
length = Lof(0) ; Länge der Datei ermitteln
For i= 1 To length
Byte.s = Mid(Hex(ReadCharacter(0, #PB_Ascii)),1)
If Len(Byte.s) < 2 ; die fehlende 0 wird bei 00h bis 0Fh vorangestellt
Byte.s = "0" + Byte.s
EndIf
HexString$ = HexString$ + Byte.s
Next
CloseFile(0)
EndIf
EndIf
If CreateFile(0, "/home/internet/HexString.txt") ; Neue Hex Stringdatei erstellen
WriteString(0, HexString$)
CloseFile(0)
Else
MessageRequester("Fehler","Die Hex Stringdatei konnte nicht erstellt werden!")
EndIf
; Und jetzt das ganze wieder zurück nach Binär
LeseFile$ = "/home/internet/HexString.txt"
If ReadFile(0, LeseFile$)
While Eof(0) = 0
HexString$ = ReadString(0)
Wend
CloseFile(0)
Else
MessageRequester("Fehler","Die Hex Stringdatei konnte nicht geöffnet werden!")
EndIf
;Debug HexString$ ; dient nur zur Kontrolle
UrsprungDatei$ = "/home/internet/Ursprung.bin" ; kann jpg oder einfach alles sein
If CreateFile(0, UrsprungDatei$) ; die Binärdatei erstellen
For i = 1 To Len(HexString$) Step 2
WriteByte (0, Val("$"+Mid(HexString$,i,2)))
Next
CloseFile(0)
Else
MessageRequester("Fehler","Die Ursprung Datei konnte nicht erstellt werden!")
EndIf
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
-
- Beiträge: 23
- Registriert: 14.12.2018 23:01
Re: Chr(0) in String verketten und in File schreiben
Danke!
Durch das Beispiel bin ich auf den fehlenden Befehl gestoßen: writebyte
Damit lässt sich die hex'00' sauber in eine Datei schreiben.
Jetzt taucht aber das nächste Problem auf: das ist sehr langsam. Wenn man ein 8MB großes
JPG dekodieren will, dauert das ewig.
Habe so eine Funktion mal als Java Class geschrieben, das geht viel schneller.
Vermutlich ist die Funktion Val("$"+Mid(HexString$,i,2)) das Problem.
Jörg
Durch das Beispiel bin ich auf den fehlenden Befehl gestoßen: writebyte
Damit lässt sich die hex'00' sauber in eine Datei schreiben.
Jetzt taucht aber das nächste Problem auf: das ist sehr langsam. Wenn man ein 8MB großes
JPG dekodieren will, dauert das ewig.
Habe so eine Funktion mal als Java Class geschrieben, das geht viel schneller.
Vermutlich ist die Funktion Val("$"+Mid(HexString$,i,2)) das Problem.
Jörg