Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi strin nach array of byte (https://www.delphipraxis.net/84481-strin-nach-array-byte.html)

liebeisttobi 17. Jan 2007 14:10


strin nach array of byte
 
hallo

irgendwie bin ich grad unfähig nen strin in einen 'array of byte' zu kopieren...

darum geht's:
ich habe einen gespeocherten md5-hash als 'string' (länge 15) und der soll wieder in einen 'array[0..15] of byte'.
eigentlich ist das ja ganz simpel (?!?) nur bekomme ich entweder ne Fehlermeldung 'inkomaptible typen' oder einen array mit "falschen Werten"

ich glaub, das was ich hier hab ist einfach nur müll, deshalb post ich es auch net...
kann mir einer mal schnell so ne scheife schreiben die meinen string in den array schiebt?
wäre nett ...

Gruber_Hans_12345 17. Jan 2007 14:14

Re: strin nach array of byte
 
Delphi-Quellcode:
var myString : string;
    byteArray : array[0..15] of byte;
begin
  CopyMemory(@byteArray[0], @myString[1], 15);
end;
(nicht getestet)

sinds wirklich nur 15 Bytes oder 16 (da 0..15 ja 16 sein sollte)

yörsch 17. Jan 2007 14:33

Re: strin nach array of byte
 
noch ne´variante :coder2:
Delphi-Quellcode:
type
  TTest = record
   case boolean of
   true : (Text : array [0..125] of char);
   false: (Zahl : array [0..125] of byte);
   end;

var OutStr : String;
TEST : TTest;
i : Integer;
b : Byte;
begin
  OutStr := 'Help';
  for i:=0 to Length(OutStr)-1 do
    TEST.Text[i] := OutStr[i];
  b := TEST.Zahl[0];
ist leider nicht mit dynamischer größe wg. case im Record! :!:

liebeisttobi 17. Jan 2007 14:38

Re: strin nach array of byte
 
vielen Dank !!!

und ja, es sind 16 ;-)

inherited 17. Jan 2007 14:49

Re: strin nach array of byte
 
Ab Delphi2006, sprich: TurboDelphi kann man glaube ich sogar
Delphi-Quellcode:
for c in mystring do
benutzen, wobei c ein char ist ;)

Der_Unwissende 17. Jan 2007 14:51

Re: strin nach array of byte
 
Zitat:

Zitat von yörsch
noch ne´variante :coder2:
Delphi-Quellcode:
type
  TTest = record
   case boolean of
   true : (Text : array [0..125] of char);
   false: (Zahl : array [0..125] of byte);
   end;

var OutStr : String;
TEST : TTest;
i : Integer;
b : Byte;
begin
  OutStr := 'Help';
  for i:=0 to Length(OutStr)-1 do
    TEST.Text[i] := OutStr[i];
  b := TEST.Zahl[0];

Ist aber auch um einiges langsamer als CopyMemory oder auch gleich Move (CopyMemory ruft auch nur move auf). Ganze Speicherbereiche als Block zu kopieren ist immer das schnellste, geht in nahezu konstanter Zeit (ganz unabhängig von der Anzahl der zu kopierenden Bytes). In deiner Variante wird die Schleife natürlich sehr oft durchlaufen und dann auch noch in jeder Iteration ein Wert gelesen und geschrieben...

Gruber_Hans_12345 17. Jan 2007 15:28

Re: strin nach array of byte
 
müsste es eigentlich nicht auch irgendwie so gehen ... ? (natürlich je nachdem wie du die variablen deklariert hast)

und sollte dann eigentlich die schnellste version sein ;)

Delphi-Quellcode:
 
var myString : string[16];
    tempR  : record
                len    : Byte;
                bytes  : packed array[0..15] of byte;
              end absolute myString;

begin
    myString := 'AB';
    // tempR.bytes[0] = A
    // tempR.bytes[1] = B
end;

yörsch 17. Jan 2007 16:12

Re: strin nach array of byte
 
Zitat:

Zitat von Der_Unwissende
Zitat:

Zitat von yörsch
noch ne´variante
[delphi] TTest = record
case boolean of
true : (Text : array [0..125] of char);
false: (Zahl : array [0..125] of byte);
end; delphi]

Ist aber auch um einiges langsamer als CopyMemory

wollte nur ne´variante zum besten geben. :oops:
der record case nuzt den gleichen speicherbereich, kann diesen aber unterschiedlich interpretieren.
wenn also das einfügen noch einbisschen optimaler ist, dann sollte das an CopyMemory ran reichen.
Bin mir aber nicht sicher wie das geht. :gruebel:

Klaus01 17. Jan 2007 16:51

Re: strin nach array of byte
 
die record variante sollte etwa so gehen:

Delphi-Quellcode:
type
  data = record
    case boolean of
      true: (text: String[15]);
      false: (byteArray: Array[0..15] of Byte);
  end;


...

procedure TForm1.Button1Click(Sender: TObject);
var
  test: data;
  i:Byte;
begin
  Memo1.Clear;
  test.text:='012345678901234';
  for i:=low(test.byteArray)+1 to high(test.byteArray) do
    begin
      Memo1.Lines.Add(InttoHex(test.ByteArray[i],2));
    end;
end;
Grüße
Klaus

Der_Unwissende 17. Jan 2007 17:26

Re: strin nach array of byte
 
Zitat:

Zitat von yörsch
wollte nur ne´variante zum besten geben. :oops:

War auch gar nicht böse gemeint. Ich wollte Dir eigentlich eher den Tipp geben, dass Du wenn Du kannst immer lieber mit Move arbeiten solltest. Also gerade bei größeren Datenmengen merkst Du den unterschied recht deutlich. Ich hab mal (ist schon ein Weilchen her) eine Tiff-Unit geschrieben, da wurden die Daten auch einmal in einer Schleife (erste Version) ausgelesen, Ladezeit für ein 150 MByte Tiff lag auch locker bei > 30 Sek. Zweite Version wurde dann mit Move gearbeitet, die gleichen Bilder waren in deutlich < 1 Sek. da (ich glaube so ca. 600-700 ms hat's gedauert).
Wenn Du also mal eine Menge Daten kopieren möchtest, dann solltest Du einfach nur Move im Hinterkopf behalten. Natürlich ist eine so mächtige Funktion nicht ganz ohne, sie prüft beim kopieren keine Speichergrenzen, gibst Du eine ungültige Startadresse oder Länge an, so werden die Bytes in Speicher geschrieben, der nicht dafür gedacht ist. Welchen Teil deiner Anwendung Du dann überschreibst und was das für Auswirkungen hat kann man dann nicht vorher sagen. Deswegen bei Move immer gut überlegen und nicht vergessen, der nutzbare Teil eines Strings beginnt immer bei 1.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz