Announcement

Collapse
No announcement yet.

Wahlfreier Zugriff dynamische Variable

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wahlfreier Zugriff dynamische Variable

    <br>
    Hallo,<br>
    <br>
    ich habe folgendes Problem:<br>
    <br>
    const<br>
    cnstAnzahl=10;<br>

    var<br>
    intZahl, i: integer;<br>
    intZeiger: ^integer;<br>
    <br>
    GetMem(intZeiger, cnstAnzahl*sizeof(integer));<br>
    i:=0;<br>
    while i<cnstAnzahl do begin<br>
    intZahl:=random(100000)+1;<br>
    writeln((i+1):3, '.Zahl= ', intZahl:6);<br>
    intZeiger^:=intZahl;<br>
    inc(intZeiger);<br>
    inc(i);<br>
    end;<br>
    <br>
    .<br>
    .<br>
    .<br>
    i:=0;<br>
    dec(intZeiger, cnstAnzahl);<br>
    while i<cnstAnzahl do begin<br>
    Writeln((i+1):3, '.Zahl= ', intZeiger^:6, ' ',integer(@intZeiger), ' ',integer(@intZeiger^));<br>
    inc(i);<br>
    if i<cnstAnzahl then begin<br>
    inc(intZeiger);<br>
    end else begin<br>
    writeln('nur zum Test');<br>
    end;<br>
    end;<br>
    .<br>
    .<br>
    FreeMem(intZeiger);<br>//hier kommt die Fehlermeldung
    .<br>
    .<br>
    .<br>
    end;<br>

    wenn ich versuche auf intZeiger zuzugreifen, bekomme ich den Fehler: Ungültige Zeigeroperation. Was mache ich falsch?<br>
    Oder gibt es noch eine bessere Lösung mit MemorySteam?<br>

    Ich hoffe es kann mir jemand helfen!
    Tschüß Jürgen

  • #2
    Sorry, ich durchschau deinen Source nicht so ganz (mit Pointern hab ich noch so meine Probleme) Hab mit MemoryStreams schon ziemlich viel Erfahrung.. Was willst du denn erreichen?

    Motz

    Comment


    • #3
      Hallo Manuel, also ich möchte eine Datei in den RAM einlesen, und dann nach einem ausgeklügelten System verschlüsseln (byteweise!). Nun hat die Sache aber einen Haken, die Performance. Je mehr ich von der Datei in den Speicher ablegen kann desto schneller läuft der ganze Prozeß ab. Die nächste Sache ist die, der zur Verfügung gestellte RAM. Ich möchte selbst bestimmen können, wieviel ich zu Verfügung stellen möchte. Der Code ist natürlich nur Beispielcode. Manchmal schreibe ich ein Konsolenprogramm um mal ein paar Dinge zu testen. Du kannst mir ja mal deine Kenntnisse über MemoryStream (evtl. FileStream) zu Verfügung stellen. Die Sache mit Streams abzufackeln, würde mir schon gefallen, da ich mich der OOP verschrieben habe. Also erstmal Danke im Voraus. Tschüß Jürge

      Comment


      • #4
        Hallo,<BR><BR>
        Nun, es gibt hier mehrere Möglichkeiten. Entweder du liest die Datei zuerst in einen MemoryStream ein, verschlüsselst diesen Stream und speicherst ihn dann, oder aber du liest einzelne Blöcke dierekt aus der Datei, verschlüsselst diese Blöcke und schreist sie in eine neue Datei. Die erste Möglichkeit wäre zu empfehlen, wenn der Benutzer die Möglichkeit haben soll mehr mit der Datei zu machen als einfahc nur verschlüsseln. Allerdings wäre hier das Problem mit dem Speicher. Ein MemoryStream schreibt nicht nur ausschließlich in den RAM. Er muss auch irgendwie mit Swap-Dateien arbeiten. Ich könnte mir sonst nicht erklären wie ich mit 64MB RAM einen 120 MB Datei in einen MemoryStream einlesen kann. Egal, auch mit Swap-Datei wird ein MemoryStream irgendwann an seine Grenzen stoßen. Wenn du daher die erste Möglichkeit wählst und das Programm soll mit Dateien beliebiger Größen arbeiten können, wird sich der Umweg über Temporäre-Dateien wahrscheinlich nicht umgehen lassen.<BR><BR>
        <U>Bsp. für Möglichkeit 1:</U><BR>
        <Font Face="Courier New" Size=2>
        <B>const</B> MAX = 15360; //15KB große Speicherblöcke einlesen<BR>
        <B>type</B> TBuffer = <B>array</B> [1..MAX] <B>of</B> Char; //Der Buffer mit dem wir Schreiben/Lesen<BR>
        <B>var</B><BR>
        &nbsp;&nbsp;ReadCount, i: Integer;<BR>
        &nbsp;&nbsp;MemStream: TMemoryStream;<BR>
        &nbsp;&nbsp;Buf: TBuffer;<BR>
        <B>begin</B><BR>
        &nbsp;&nbsp;MemStream := TMemoryStream.Create;<BR>
        &nbsp;&nbsp;MemStream.LoadFromFile('Test.dat'); //verwende ich nie, da diese Aktion bei größeren Dateien einen längeren Zeitraum brauch. In dieser Zeit steht das gesamte System still. Ich hab mir da eine eigene Methode geschrieben die eben immer wieder systemzeit freigibt<BR>
        &nbsp;&nbsp;<B>while</B> MemStream.Position < MemStream.Size <B>do</B><BR>
        &nbsp;&nbsp;<B>begin</B><BR>
        &nbsp;&nbsp;&nbsp;&nbsp;ReadCount := MemStream.Read(Buf, MAX); //liest einen 15KB großen Speicherblock ein. in ReadCount wird die Anzahl der tatsächlich eingelesenen Bytes zurückgegeben (zb: wenn der Stream kleiner als 15KB ist)<BR>
        &nbsp;&nbsp;&nbsp;&nbsp;<B>for</B> i := 1 to ReadCount <B>do</B><BR>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[i] := Verschlüsseln(Buf[i]); //Jedes Byte im Buffer verschlüsseln<BR>
        &nbsp;&nbsp;&nbsp;&nbsp;MemStream.Seek(-ReadCount, soFromPosition); //setzt die Position in der Datei auf die Position vor dem einlesen des Buffers<BR>
        &nbsp;&nbsp;&nbsp;&nbsp;MemStream.Write(Buf, ReadCount); //und die alten Bytes durch die verschlüsselten ersetzen (in einem MemoryStream werden beim schreiben die bytes IMMER nur ersetzt, nie eingefügt!!)<BR>
        &nbsp;&nbsp;<B>end</B>;<BR>
        &nbsp;&nbsp;MemStream.SaveToFile('Crypted.dat');<B R>
        <B>end</B>;</Font><BR><BR>
        <U>Bsp. für Möglichkeit 2:</U><BR>
        <Font Face="Courier New" Size=2>
        <B>const</B> MAX = 15360; //15KB große Speicherblöcke einlesen<BR>
        <B>type</B> TBuffer = <B>array</B> [1..MAX] <B>of</B> Char; //Der Buffer mit dem wir Schreiben/Lesen<BR>
        <B>var</B><BR>
        &nbsp;&nbsp;ReadCount, i: Integer;<BR>
        &nbsp;&nbsp;Source, Target: TFileStream;<BR>
        &nbsp;&nbsp;Buf: TBuffer;<BR>
        <B>begin</B><BR>
        &nbsp;&nbsp;Source := TFileStream.Create('Test.dat', fmOpenRead or fmShareDenywrite); //öffnet die Original-Datei<BR>
        &nbsp;&nbsp;Target := TFileStream.Create('Crypted.dat', fmCreate or fmShareDenywrite); //erzeugt die Ziel-Datei<BR>
        &nbsp;&nbsp;<B>while</B> Source.Position < Source.Size <B>do</B><BR>
        &nbsp;&nbsp;<B>begin</B><BR>
        &nbsp;&nbsp;&nbsp;&nbsp;ReadCount := Source.Read(Buf, MAX); //liest einen 15KB großen Speicherblock ein. in ReadCount wird die Anzahl der tatsächlich eingelesenen Bytes zurückgegeben (zb: wenn die Datei kleiner als 15KB ist)<BR>
        &nbsp;&nbsp;&nbsp;&nbsp;<B>for</B> i := 1 to ReadCount <B>do</B><BR>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[i] := Verschlüsseln(Buf[i]); //Jedes Byte im Buffer verschlüsseln<BR>
        &nbsp;&nbsp;&nbsp;&nbsp;Target.Write(Buf, ReadCount); //und den verschlüsselten Buffer in die Ziel-Datei schreiben<BR>
        &nbsp;&nbsp;<B>e

        Comment


        • #5
          Danke Manuel, Du hast den Nagel direkt auf den Kopf getroffen!

          Tschüß Jürge

          Comment


          • #6
            Freut mich, falls sonst noch irgendwelche Probleme auftreten kannst du dich ruhig bei mir melden. eMail: [email protected]

            Motz

            Comment


            • #7
              Hi Jürgen

              Du könntest natürlich auch schon vollständig fertige Verschlüsselungstools nutzen, die dies alles können. Der Vorteil liegt dann im besonderen das diese Tools/Komponenten wirklich sicherere Verfahren wie Blowfish, IDEA, RC4, Twofish, Rijndael etc. nutzen.

              Als Beispiel für die Anwendung vom DEC -> "Delphi Encryption Compendium".

              <pre>

              with TCipher_Blowfish.Create('Passwort', nil) do
              try
              EncodeFile('D:\test.txt', 'D:\test.txt');
              finally
              Release;
              end;

              </pre>

              Obige Routine verschlüsselt die Datei "D:\Test.txt" inplaced in "D:\Test.txt" mit dem Blowfish Algorithmus. D.h. die orginal-datei wird an Ort und Stelle mit den verschl. Daten überschrieben. Damit kann die Orginaldatei NICHT mehr auf grund der FAT, Swap-Datei wiederhergestellt werden. Arbeitest Du mit temporären Dateien müssen diese nach Verschlüsselung gelöscht werden, AUF SICHERE ART, ansonsten kann man diese wiederhestellen. Arbeitest Du mit großen MemoryStream oder Memory Mapped Files werden die Original Daten in der Swap-Datei zwischengespeichert. Diese zwischengespeicherten daten lassen sich NICHT löschen, können also wiederhergestellt werden.

              Gruß Hagen

              PS: download bei DSP (Delphi Super Page), Torry.ru oder VCLComponents.com, jeweils in Sektion "Compression/Cryptographie"

              Comment

              Working...
              X