AGB  ·  Datenschutz  ·  Impressum  







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

strin nach array of byte

Ein Thema von liebeisttobi · begonnen am 17. Jan 2007 · letzter Beitrag vom 17. Jan 2007
Antwort Antwort
liebeisttobi

Registriert seit: 30. Jan 2006
6 Beiträge
 
#1

strin nach array of byte

  Alt 17. Jan 2007, 14:10
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 ...
Tobias
3. 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0 2 8 8 4 1 9 7 1 6 9 3 9 9 3 7 5 1 0 5 8 2 0 9 7 4 9 4 4 5 9 2 3 0 7 8 1 6 4 0 6 2 8 6 2 0 8 9 9 8 6 2 8 0 3 4 8 2 5 3 4 2 1 1 7 0 6 7 9 8
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#2

Re: strin nach array of byte

  Alt 17. Jan 2007, 14:14
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)
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#3

Re: strin nach array of byte

  Alt 17. Jan 2007, 14:33
noch ne´variante
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!
Jörg
have FUN
  Mit Zitat antworten Zitat
liebeisttobi

Registriert seit: 30. Jan 2006
6 Beiträge
 
#4

Re: strin nach array of byte

  Alt 17. Jan 2007, 14:38
vielen Dank !!!

und ja, es sind 16
Tobias
3. 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0 2 8 8 4 1 9 7 1 6 9 3 9 9 3 7 5 1 0 5 8 2 0 9 7 4 9 4 4 5 9 2 3 0 7 8 1 6 4 0 6 2 8 6 2 0 8 9 9 8 6 2 8 0 3 4 8 2 5 3 4 2 1 1 7 0 6 7 9 8
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: strin nach array of byte

  Alt 17. Jan 2007, 14:49
Ab Delphi2006, sprich: TurboDelphi kann man glaube ich sogar
for c in mystring do benutzen, wobei c ein char ist
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: strin nach array of byte

  Alt 17. Jan 2007, 14:51
Zitat von yörsch:
noch ne´variante
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...
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#7

Re: strin nach array of byte

  Alt 17. Jan 2007, 15:28
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;
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#8

Re: strin nach array of byte

  Alt 17. Jan 2007, 16:12
Zitat von Der_Unwissende:
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.
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.
Jörg
have FUN
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: strin nach array of byte

  Alt 17. Jan 2007, 16:51
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
Klaus
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: strin nach array of byte

  Alt 17. Jan 2007, 17:26
Zitat von yörsch:
wollte nur ne´variante zum besten geben.
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.
  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 10:45 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