![]() |
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. |
AW: TMemoryStream mit Zufallszahlen füllen
|
AW: TMemoryStream mit Zufallszahlen füllen
Zitat:
|
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; |
AW: TMemoryStream mit Zufallszahlen füllen
Wie wäre es so:
Delphi-Quellcode:
Gruß
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; K-H |
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) ... |
AW: TMemoryStream mit Zufallszahlen füllen
Genau genommen ist die Streamgröße durch 4 teilbar und es müssen vorzeichenlose Integerwerte, also DWords sein.
|
AW: TMemoryStream mit Zufallszahlen füllen
Zitat:
|
AW: TMemoryStream mit Zufallszahlen füllen
Zitat:
Lies diese 4 Bytes nachher in ein
Delphi-Quellcode:
und du hast ein
DWORD
Delphi-Quellcode:
.
DWORD
Lies diese 4 Bytes nachher in ein
Delphi-Quellcode:
und du hast ein
Integer
Delphi-Quellcode:
.
Integer
Lies diese 4 Bytes nachher in ein
Delphi-Quellcode:
und du hast ein
Double
Delphi-Quellcode:
.
Double
... ;) @sahimba :thumb: Ich mach hier mal das Echo :mrgreen: |
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);
|
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: |
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; |
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; |
AW: TMemoryStream mit Zufallszahlen füllen
Zitat:
Delphi-Quellcode:
Wenn Du nur Bytes schreiben willst... Dann schreib auch nur Bytes...
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; |
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; |
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; |
AW: TMemoryStream mit Zufallszahlen füllen
Also wenn schon, dann so:
Delphi-Quellcode:
Wobei ich mir nicht sicher bin ob das nicht, dank Win Cache, zu dem Ergebnis von dem führt:
for i:=0 to 255 do
begin Fillchar(Beispielstream.Memory^,Beispielstream.Size, I); Beispielstream.SaveToFile(Datei); end;
Delphi-Quellcode:
i:=255;
Fillchar(Beispielstream.Memory^,Beispielstream.Size, I); Beispielstream.SaveToFile(Datei); |
AW: TMemoryStream mit Zufallszahlen füllen
Zitat:
Zitat:
Lange nicht mehr mit beschäftigt... |
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:
|
AW: TMemoryStream mit Zufallszahlen füllen
Zitat:
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 23:06 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