Chr(0) in String verketten und in File schreiben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Chr(0) in String verketten und in File schreiben

Beitrag von Jörg Burdorf »

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
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Chr(0) in String verketten und in File schreiben

Beitrag von Bisonte »

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​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Chr(0) in String verketten und in File schreiben

Beitrag von RSBasic »

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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Re: Chr(0) in String verketten und in File schreiben

Beitrag von Jörg Burdorf »

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
Benutzeravatar
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

Beitrag von HeX0R »

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!
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Chr(0) in String verketten und in File schreiben

Beitrag von Mijikai »

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):
Bild
Sommertv
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

Beitrag von Sommertv »

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
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Benutzeravatar
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

Beitrag von TroaX »

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:

Code: Alles auswählen

Define Zahl.a, Hex.s
Hex = "00"

Zahl = Val("$" + Hex)
Debug Zahl
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.
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 :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Sommertv
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

Beitrag von Sommertv »

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...

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...
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Re: Chr(0) in String verketten und in File schreiben

Beitrag von Jörg Burdorf »

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
Antworten