AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionsweise von SetLength

Ein Thema von stb2050 · begonnen am 10. Aug 2011 · letzter Beitrag vom 11. Aug 2011
Antwort Antwort
stb2050

Registriert seit: 3. Aug 2011
4 Beiträge
 
#1

AW: Funktionsweise von SetLength

  Alt 10. Aug 2011, 21:57
@rollstuhlfahrer: Grundsätzlich hast Du Recht - leider ist die Delphi-Verschlüsselung in dem Programm, dessen Daten ich mit PHP entschlüsseln musst, fest enthalten und ich kann nicht davon abweichen.

@sirius: Soweit habe ich das verstanden, ich glaube das mit den Zahlen ist auch nicht das Problem.

Ich vermute, dass mein Unverständnis an der Delphi-Funktion move begründet ist.

Code:
var
  dest : AnsiString;
  source: LongInt;

begin

 source := 9491535;
 dest  :='';

 SetLength(dest, 3);
 Move(source, dest[1], 3);

 Writeln(source);
 Writeln(dest);

end.
Kann mir jemand erklären, warum dest als Ergebnis (drittes Zeichen: CR) ist. Eigentlich sollten ja nur die ersten 3 Zeichen von source in dest kopiert werden. Findet hier irgendwo eine Umkonvertierung statt?

Liebe Grüße,
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Funktionsweise von SetLength

  Alt 10. Aug 2011, 22:15
Dein Zahl "9491535" schreiben wir mal kurz um in Hex:
00 90 D4 4F
oder als Little Endian
4F D4 90 00

Das da oben steht also im Speicher. mit mov werden die ersten 3 Bytes (also: 4F D4 90) in den String kopiert. Wenn du das jetzt ausgibst, werden die Bytes als ZEichen interpretiert, und jetzt schau mal in eine handelsübliche ASCII/ANSI-Tabelle mit Cp1252.
4F = O
D4 = Ô
90 = É
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#3

AW: Funktionsweise von SetLength

  Alt 10. Aug 2011, 23:36
Tja, in PHP werden Strings eben initialisiert.
Das geschieht in Delphi nicht, aus performancegründen, denn wenn man SetLength verwendet, sollte man danach auch die reservierten Dinge initialisieren, bzw. gleich mit den gewünschten Werten füllen und bei Letzerem wäre eine vorherige automatische Initialisierung nur unnötiger Overhead.

Und wenn jemand es eben nichts befüllt/initialisiert, dann soll man sich auch nicht wundern, wenn etwas unerwartetes darin erscheint.
Genauso wie bei nichtinitialisierten lokalen Variablen.


Wenn man das SetLenght hoch genug wählt, dann kann ich euch garantieren, was sich in dem String befinden wird.

Bei kurzen Strings und wird ein Speicherblock vom Delphi-Memory-Manager verwendet und jenachdem ob und für was dieser Speicherblock vorher verwendet wurde, befindet sich doch auch schon "irgendwas" drin.

Wird der String aber größer, als der größte verwaltete Block des MM, wird direkt bei Windows ein Speicherbereich extra für diesen String bestellt und da Windows sowas immer mit 0 initialisiert, wird der String auch auch nur vielen #0 bestehen.


PS: Delphi-Referenz durchsuchenDupeString und Delphi-Referenz durchsuchenStringOfChar
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Aug 2011 um 23:39 Uhr)
  Mit Zitat antworten Zitat
stb2050

Registriert seit: 3. Aug 2011
4 Beiträge
 
#4

AW: Funktionsweise von SetLength

  Alt 11. Aug 2011, 17:11
Danke für die Hilfe - habe es nun hinbekommen, der Hinweis von sirius hat zum Durchbruch verholfen

Liebe Grüße,
Steffen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz