Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TMemoryStream mit Zufallszahlen füllen (https://www.delphipraxis.net/187879-tmemorystream-mit-zufallszahlen-fuellen.html)

devidespe 11. Jan 2016 16:11

TMemoryStream mit Zufallszahlen füllen
 
Hallo,

ich habe einen TMemoryStream, den ich von einer bestimmten Stelle einlese und mit Zufallszahlen befüllen möchte. Hat jemand einen Tipp, wie ich das am schnellsten bewerkstelligen kann?

Vielen Dank.

Sir Rufo 11. Jan 2016 16:14

AW: TMemoryStream mit Zufallszahlen füllen
 
Ja.
Code:
Wiederhole
  Erzeuge Zufallszahl
  Zufallszahl in Stream schreiben
Bis genug
Was konkret macht dir dabei Probleme?
  1. Erzeugen einer Zufallszahl => Delphi-Referenz durchsuchenRandom
  2. Schreiben einer Zahl in einen Stream => Delphi-Referenz durchsuchenTStream

Perlsau 11. Jan 2016 16:18

AW: TMemoryStream mit Zufallszahlen füllen
 
Zitat:

Zitat von devidespe (Beitrag 1326656)
Hallo, ich habe einen TMemoryStream, den ich von einer bestimmten Stelle einlese und mit Zufallszahlen befüllen möchte. Hat jemand einen Tipp, wie ich das am schnellsten bewerkstelligen kann?

Das sind recht dürftige Angaben, die du hier zur Verfügung stellst. Ein TMemoryStream ist ja nicht typisiert, deshalb könnte ich jetzt nicht entscheiden, ob du Float- oder Integerwerte oder die Zahlen in Stringform dort im Stream haben willst. Letztlich kommt es darauf an, was du mit diesem Stream machen willst bzw. wie diese etwas ominöse Anforderung "TMemoryStream mit Zufallszahlen füllen" überhaupt zustande kommt.
  1. Was hast du denn bereits veruscht?
  2. Was ist dabei herausgekommen?
  3. Wie lauten die Fehlermeldungen?

devidespe 11. Jan 2016 16:41

AW: TMemoryStream mit Zufallszahlen füllen
 
Ich lese eine Datei in einen Memory Stream ein, möchte den Inhalt gerne mit Zufallszahlen beschreiben, und das wieder in die Datei zurück schreiben.

Dabei wird die MemoryStream Größe automatisch der Dateigröße mit SetSize angepasst.

Im Prinzip benötige ich eine Schleife, in der ich abhängig von der Streamgröße Zufallszahlen generiere. Bisher habe ich folgendes:

Delphi-Quellcode:
var i : Integer;
    Beispielstream : TMemoryStream;
...
begin
  Beispielstream:=TMemoryStream.Create;
  Beispielstream.SetSize(DateiGroesseInBytes);
  Beispielstream.LoadFromFile(Datei);

  Randomize;
  for i:=0 to Beispielstream.Size do Beispielstream.Write(Random(256), 1);

  Beispielstream.SaveToFile(Datei);
  Beispielstream.Free;
end;

p80286 11. Jan 2016 16:56

AW: TMemoryStream mit Zufallszahlen füllen
 
Wie wäre es so:
Delphi-Quellcode:
var i : Integer;
    Beispielstream : TMemoryStream;
...
begin
  Beispielstream:=TMemoryStream.Create;
  Beispielstream.SetSize(DateiGroesseInBytes);

  Randomize;
  for i:=0 to Beispielstream.Size-1 do Beispielstream.Write(Random(256), 1);

  Beispielstream.SaveToFile(Datei);
  Beispielstream.Free;
end;
Gruß
K-H

Sir Rufo 11. Jan 2016 17:01

AW: TMemoryStream mit Zufallszahlen füllen
 
Das erzeugt natürlich einen Stream in Quattro-Größe :stupid:

Nehmen wir an, wir setzen Size auf 100 und schreiben jetzt also 100 Integer-Werte (=4 Byte) ...

devidespe 11. Jan 2016 18:15

AW: TMemoryStream mit Zufallszahlen füllen
 
Genau genommen ist die Streamgröße durch 4 teilbar und es müssen vorzeichenlose Integerwerte, also DWords sein.

sahimba 11. Jan 2016 18:20

AW: TMemoryStream mit Zufallszahlen füllen
 
Zitat:

Zitat von devidespe (Beitrag 1326664)
...und es müssen vorzeichenlose Integerwerte, also DWords sein.

Ob das vorzeichenlose DWords, Integer oder Rumpelpumpels sind macht doch keinen Unterschied, so lange es 4 Byte sind. WAS diese 4 Byte darstellen ist am Ende reine "Interpretationssache".

Sir Rufo 11. Jan 2016 18:24

AW: TMemoryStream mit Zufallszahlen füllen
 
Zitat:

Zitat von devidespe (Beitrag 1326664)
Genau genommen ist die Streamgröße durch 4 teilbar und es müssen vorzeichenlose Integerwerte, also DWords sein.

Wenn da eine zufällige Folge von 4 Byte Blöcken rein soll, wen interessiert dann ob da was vorzeichenlos ist oder nicht?

Lies diese 4 Bytes nachher in ein
Delphi-Quellcode:
DWORD
und du hast ein
Delphi-Quellcode:
DWORD
.
Lies diese 4 Bytes nachher in ein
Delphi-Quellcode:
Integer
und du hast ein
Delphi-Quellcode:
Integer
.
Lies diese 4 Bytes nachher in ein
Delphi-Quellcode:
Double
und du hast ein
Delphi-Quellcode:
Double
.
...
;)

@sahimba :thumb: Ich mach hier mal das Echo :mrgreen:

devidespe 11. Jan 2016 18:31

AW: TMemoryStream mit Zufallszahlen füllen
 
Okay also dann muss ich ja durch 4 teilen bei der For-Schleife, und Ramdom entsprechend nach oben anpassen (ich glaube Integer ist vordefiniert mit einem Maximalwert von 2147483647:

Delphi-Quellcode:
for i:=0 to (Beispielstream.Size-1 DIV 4) do Beispielstream.Write(Random(2147483647), 4);

Sir Rufo 11. Jan 2016 18:33

AW: TMemoryStream mit Zufallszahlen füllen
 
Nur mal so OT am Rande:

Schon mal darüber nachgedacht, dass man mit so einer zufälligen Bytefolge auch zufällig einen Virus produziert, der vom Virenscanner dann gefressen wird?

Oder es ist ein ganz neuer noch unbekannter Virus der dann das ganze Internet lahmlegt?
Oder es wird ein Bild, was den wahren Mörder von JFK zeigt? (Vielleicht sogar irgendein Alien?)
...

Also nicht wundern was dabei herauskommen kann :stupid:

nahpets 11. Jan 2016 18:48

AW: TMemoryStream mit Zufallszahlen füllen
 
Delphi-Quellcode:
for i:=0 to (Beispielstream.Size-1 DIV 4) do Beispielstream.Write(Random(2147483647), 4);


Punkt vor Strichrechnung beachten!
Delphi-Quellcode:
for i:=0 to ((Beispielstream.Size-1) DIV 4) do Beispielstream.Write(Random(2147483647), 4);



Wie wäre es denn damit?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i                  : Integer;
    Beispielstream     : TMemoryStream;
    DateiGroesseInBytes : Integer;
    dw                 : DWord;
begin
  DateiGroesseInBytes := 100;
  Beispielstream:=TMemoryStream.Create;
  Beispielstream.SetSize(DateiGroesseInBytes);
  Randomize;
  for i := 0 to (Beispielstream.Size - 1) Div SizeOf(dw) do begin
    dw := Random(MaxInt);
    Beispielstream.Write(dw, SizeOf(dw));
  end;
  Beispielstream.SaveToFile('Datei');
  Beispielstream.Free;
end;

Sir Rufo 11. Jan 2016 18:56

AW: TMemoryStream mit Zufallszahlen füllen
 
So gibt es einen Zufallswert, der den gesamten Integer-Bereich abdeckt:
Delphi-Quellcode:
function GetTotalRandomInteger() : Integer;
begin
  Result := 0;
  for i := 1 to 4 do
    Result := ( ( Result shl 8 ) and $FFFFFF00 ) or Random( 256 );
end;

Mavarik 11. Jan 2016 21:04

AW: TMemoryStream mit Zufallszahlen füllen
 
Zitat:

Zitat von devidespe (Beitrag 1326661)
Delphi-Quellcode:
var i : Integer;
    Beispielstream : TMemoryStream;
...
begin
  Beispielstream:=TMemoryStream.Create;
  Beispielstream.SetSize(DateiGroesseInBytes);
  Beispielstream.LoadFromFile(Datei);

  Randomize;
  for i:=0 to Beispielstream.Size do Beispielstream.Write(Random(256), 1);

  Beispielstream.SaveToFile(Datei);
  Beispielstream.Free;
end;

hmm

Delphi-Quellcode:
var i : Integer;
    Beispielstream : TMemoryStream;
...
begin
  Beispielstream:=TMemoryStream.Create;
  Beispielstream.SetSize(DateiGroesseInBytes); // Wofür?
  Beispielstream.LoadFromFile(Datei); // Daraus ergibt sich die Größe des Memstreams...


  Randomize;
  for i:=0 to Beispielstream.Size do Beispielstream.Write(Random(256), 1); // Warum erst die Datei laden um die Daten dann zu überschreiben...

  Beispielstream.SaveToFile(Datei);
  Beispielstream.Free;
end;
Wenn Du nur Bytes schreiben willst... Dann schreib auch nur Bytes...

Neutral General 11. Jan 2016 21:16

AW: TMemoryStream mit Zufallszahlen füllen
 
Ich schätze er will einen Datei-Shredder bauen....
Du brauchst diese durch-4-Teilerei nicht.

Delphi-Quellcode:
var i : Integer;
    Beispielstream : TMemoryStream;
begin
  Beispielstream:=TMemoryStream.Create;
  try
    Beispielstream.LoadFromFile(Datei);

    //Randomize; Sollte nur einmal im Programm aufgerufen werden!
    for i:=0 to Beispielstream.Size-1 do
      PByte(NativeUInt(Beispielstream.Memory)+i)^ := random(256);

    Beispielstream.SaveToFile(Datei);
  finally
    Beispielstream.Free;
  end;
end;

Mavarik 11. Jan 2016 21:24

AW: TMemoryStream mit Zufallszahlen füllen
 
Na dann eher so...

Delphi-Quellcode:
var i : byte;
    Beispielstream : TMemoryStream;
begin
  Beispielstream:=TMemoryStream.Create;
  try
    Beispielstream.LoadFromFile(Datei);

    //Randomize; Sollte nur einmal im Programm aufgerufen werden!

    for i:=0 to 255 do
      begin
        Fillchar(Beispielstream.Memory^,I,Beispielstream.Size);
        Beispielstream.SaveToFile(Datei);
      end;
       
  finally
    Beispielstream.Free;
  end;
end;

bepe 11. Jan 2016 21:53

AW: TMemoryStream mit Zufallszahlen füllen
 
Also wenn schon, dann so:
Delphi-Quellcode:
    for i:=0 to 255 do
      begin
        Fillchar(Beispielstream.Memory^,Beispielstream.Size, I);
        Beispielstream.SaveToFile(Datei);
      end;
Wobei ich mir nicht sicher bin ob das nicht, dank Win Cache, zu dem Ergebnis von dem führt:

Delphi-Quellcode:
        i:=255;
        Fillchar(Beispielstream.Memory^,Beispielstream.Size, I);
        Beispielstream.SaveToFile(Datei);

Mavarik 11. Jan 2016 22:04

AW: TMemoryStream mit Zufallszahlen füllen
 
Zitat:

Zitat von bepe (Beitrag 1326685)
Also wenn schon, dann so:
Delphi-Quellcode:
    for i:=0 to 255 do
      begin
        Fillchar(Beispielstream.Memory^,Beispielstream.Size, I);
        Beispielstream.SaveToFile(Datei);
      end;

Klar, wollte sehen, ob jemand den Fehler findet...:stupid:

Zitat:

Zitat von bepe (Beitrag 1326685)
Wobei ich mir nicht sicher bin ob das nicht, dank Win Cache, zu dem Ergebnis von dem führt:...

Tja gute Frage... Vielleicht hat man auch auf der Festplatte dann 255 gelöschte Dateien mit 0-254'er Inhalt und eine mit 255er...

Lange nicht mehr mit beschäftigt...

Sir Rufo 11. Jan 2016 22:41

AW: TMemoryStream mit Zufallszahlen füllen
 
Wenn man eine SSD sein eigen nennt, dann wird das kein Datei-Shredder, sondern ein SSD-Ager (wie lasse ich meine SSD besonders schnell altern) :stupid:

HolgerX 12. Jan 2016 08:01

AW: TMemoryStream mit Zufallszahlen füllen
 
Zitat:

Zitat von devidespe (Beitrag 1326667)
Okay also dann muss ich ja durch 4 teilen bei der For-Schleife, und Ramdom entsprechend nach oben anpassen (ich glaube Integer ist vordefiniert mit einem Maximalwert von 2147483647:

Delphi-Quellcode:
for i:=0 to (Beispielstream.Size-1 DIV 4) do Beispielstream.Write(Random(2147483647), 4);

Nicht unbedingt ;)

Da 4 Bytes = 1 DWORD, ist es egal, ob Du nun 4 zufällige Bytes oder 1 zufalliges DWORD erzeugst..

Nur bei dem vorhandenen RANDOM von Delphi, ist sogar die Lösung per 4x Byte zufälliger, wie einmal DWORD..
Ist halt kein 'richtiger' Zufallsgenerator, da Coputer sich damit schwer tun.. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 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