CoderZ.cc

Zurück   CoderZ.cc > Programmierung > Delphi, Pascal > Delphi\Pascal Hilfe


 
Themen-Optionen Ansicht
28.01.2014, 19:15   #1
Leryk (Offline)
Coderz Mitglied
 
Registriert seit: 12.06.2024
Beiträge: 30
Thanks: 5
Thanked 10 Times in 7 Posts
Standard Könnte mir Jemand den den Code erklären.

Hi Leute. Ich habe ein ein Code benutzt den ich nicht verstehe.
Ich weißt zwar wozu ich den brauche und was (eigentlich) passiert.
Ich möchte es aber wissen genau was in jeder Zeile passiert.
Vielleicht kann mir Jemand helfen.
Ich habe den Code auf das Wesentliche gekürzt.
Memory Stream wird nach String konvertiert.
              strmOutput.position := 0;                   // Stream an Anfang bringen
              Buff := Stralloc(strmOutput.Size + 1);
              strmOutput.readbuffer(Buff[0], strmOutput.Size);
             (Buff + strmOutput.Size)^ := chr(0);
              SetString(Str, Buff, strmOutput.size);
              strdispose(Buff);
Ich glaube zu wissen was in Jeder Zeile passiert, hätte aber liebend gerne eine Erklärung von einem Profi gelesen.
Bitte etwas mehr zu dem Verweis in dieser Zeile --> (Buff + strmOutput.Size)^ := chr(0);

Ich habe etwas darüber gelesen, kann es aber nicht wirklich nachvollziehen.
Bitte keine Verweise auf ein Buch. Ich kann schon lesen, googeln ist mir auch nicht fremd. Bin nur an professioneller Erklärung interessiert.
Danke.
  Mit Zitat antworten
28.01.2014, 23:02   #2
easysurfer (Offline)
Third Level User
 
 
Registriert seit: 31.10.2024
Beiträge: 430
Thanks: 69
Thanked 245 Times in 133 Posts
Standard

Ich kann zwar kein Delphi, aber wenn der := Operator ein Zuweisungsoperator ist, kann Ich dir sagen was da abläuft.

Delphi arbeitet ja relativ "Systemnahe", also muss ein String mit einem Nullterminator abgeschlossen werden. Also wird die letze Stelle (= Adresse von BUF + SIZE) mit einer Null gefüllt. Wahrscheinlich wird der String bei der SetString Methode erst dann als String erkannt.

Greez
__________________
Gamehacking, Reversing and Security
  Mit Zitat antworten
29.01.2014, 12:23   #3
Leryk (Offline)
Coderz Mitglied
 
Registriert seit: 12.06.2024
Beiträge: 30
Thanks: 5
Thanked 10 Times in 7 Posts
Standard

strmOutput.position := 0;                             
Buff := Stralloc(strmOutput.Size + 1);               
strmOutput.readbuffer(Buff[0], strmOutput.Size);             
 (Buff + strmOutput.Size)^ := chr(0);               
SetString(Str, Buff, strmOutput.size);               
strdispose(Buff);
OK. Ich versuche zu verstehen.
1. Stream an Anfang setzen
2. Buffer (String) auf die Länge von StrmOutput deklarieren und den Speicher dafür reservieren. Eigentlich verstehe ich die Stralloc Function nicht wirklich.
Laut Hilfe ist die function auch veraltet weil die PAnsiStrings schon nullterminiert sind.
3. verrstehe ich nicht. Da es ohne Schleife läuft verstehe ich es so als ob immer nur ein Wert erfasst wurde, weil der Wert bis auf die Länge immer als ein wert ausgelesen wird. (Dem ist aber nicht so. Denke ich)
4. Hier wird der String eben nullterminiert (Verstehe ich nicht wirklich warum es so sein muss. Den Speicher habe ich doch schon reserviert.)
5. Das wäre eigentlich klar, ich komme aber wieder zu dem Punkt wo es keine Schleife gibt. Deshalb passt mir das nicht wirklich. Obwohl verständlich.

6. Unwichtig weil es mit StrAlloc zusammenhängt.
(StrDispose dient der Rückwärtskompatibilität. StrDispose entfernt einen String vom Heap, der zuvor mit StrAlloc oder StrNew zugewiesen wurde. )

Somit habe ich meine Probleme mit der Verständnis etwas genauer geschildert.
Ich habe die Hilfe dazu genau gelesen, leider will es nicht in mein Kopf rein.
Ich hoffe noch auf genauere Erklärung. Sonst muss ich mir mehr Beispiele anschauen. Bis jetzt war es ohne Internet leider schlecht möglich.
  Mit Zitat antworten
01.02.2014, 11:35   #4
0x1cedd1ce (Offline)
Moderator
 
Registriert seit: 02.09.2024
Beiträge: 53
Thanks: 0
Thanked 6 Times in 6 Posts
Standard Code Erklärung

// Stream auf Anfang setzen
strmOutput.position := 0;
 // Es wird ein PChar Buffer reserviert, der den ganzen Stream 
// und ein zusätzliches Zeichen aufnehmen kann
Buff := Stralloc(strmOutput.Size + 1);
 // Der Stream wird in den Buffer kopiert, Buff[0] ist das erste 
// Element  des Buffers und gleichbedeutend mit Buff^. 
// Also einfach ein Pointer auf  den Anfang des Buffers.
strmOutput.readbuffer(Buff[0], strmOutput.Size);
// an die letzte Position wird ein Null-Byte (chr(0)) geschrieben.
// (Buff+strmOutput.Size)^ == Buff[strmOutput.Size]
(Buff + strmOutput.Size)^ := chr(0); 
 // jetzt wird in den AnsiString  Str der Buffer kopiert. 
// SetString setzt Str auf die länge von  strmOutput.size und 
// kopiert dann strmOutput.size Zeichen aus Buff in den  Str. 
// Also ist es egal ob dann ein Nullbyte kommt oder nicht. 
// Laut freepascal.org kann ein String nur 255 Zeichen lang sein. 
//Daher sollte vorher überprüft werden ob der Stream nicht zu lang ist.
SetString(Str, Buff, strmOutput.size);
// Den buffer wegwerfen und den Speicher freigeben
strdispose(Buff);

Geändert von 0x1cedd1ce (01.02.2025 um 11:39 Uhr) Grund: Zeilenumbrüche eingefügt
  Mit Zitat antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:18 Uhr.

Powered by vBulletin®
Copyright ©2008 - 2017
Template-Modifikationen durch TMS