+ Antworten
Seite 2 von 2 ErsteErste 1 2
Ergebnis 11 bis 20 von 20
  1. #11
    Registriert seit
    08.02.2005
    Ort
    St. Gallen / Schweiz
    Alter
    55
    Beiträge
    1.247

    Standard

    Hi zusammen

    Das mit den 2 Mia. und der Datei von 74 Byte kann so ja eben doch nicht aufgehen - denk ich mir jetzt mal. Vielleicht denke ich aber eben falsch...

    OK:
    Beim speichern hat Len diese Wahnsinnsgrösse
    Dann wird Len verwendet, um den String vollständig einzulesen, oder genauer: an der Position, an der der String beginnt, werden Len Zeichen gelesen - und die werden dann in den Stream geschrieben. Und wenn der String kürzer als Len ist, werden jene Zeichen gelesen, die hinter dem Speicherbereich des Strings liegen - und das kann sonstwas sein. Der "String" wäre dann also diese 2 Mia Byte gross und die Datei damit eben auch...
    Gerade habe ich die Help konsultiert. Und die hab ich jetzt so verstanden, dass der PChar immer die Länge hat, die man setzt - also sollte ich mich nicht geirrt haben.

    Gruss
    Delbor
    http://www.delbor.ch

    Was wirklich zählt, ist Intuition. Albert Einstein

    ________________

    Delbor alias Zoran

  2. #12
    Registriert seit
    08.02.2005
    Ort
    St. Gallen / Schweiz
    Alter
    55
    Beiträge
    1.247

    Standard

    Hi Xentar
    Sorry, aber ich versteh noch nicht ganz, wo es hakt?
    Die Datei müsste doch sicher grösser sein, als der in ihr gespeicherte String, da noch mindestens eine Längenangabe (Len) gespeichert wird.

    Gruss
    Delbor
    http://www.delbor.ch

    Was wirklich zählt, ist Intuition. Albert Einstein

    ________________

    Delbor alias Zoran

  3. #13
    Registriert seit
    28.07.2002
    Ort
    Raum Karlsruhe
    Alter
    50
    Beiträge
    21.651

    Standard

    PChar ist 0 Terminiert.

    Da gibt es keine gespeicherte Länge.
    Der String wird solange "gelesen", bis NULL dort steht.

    DL
    Es gibt Wissenschaftler, die behaupten, dass Logik "universell", also überall gleich, sei...
    Ich treffe täglich Menschen, die mit "ihrer" Logik das Gegenteil beweisen.

  4. #14
    Registriert seit
    08.02.2005
    Ort
    St. Gallen / Schweiz
    Alter
    55
    Beiträge
    1.247

    Standard

    Hi Dragonslear
    PChar ist 0 Terminiert.

    Da gibt es keine gespeicherte Länge.
    Der String wird solange "gelesen", bis NULL dort steht.
    Eben. Und wenn das 0 erst nach 2 Mia. steht, wird bis dahin gelesen - egal, ob der String tatsächlich so lang ist oder nicht.

    Gruss
    Delbor
    http://www.delbor.ch

    Was wirklich zählt, ist Intuition. Albert Einstein

    ________________

    Delbor alias Zoran

  5. #15
    Registriert seit
    06.06.2004
    Ort
    worms
    Alter
    55
    Beiträge
    3.126

    Standard

    und warum versuchst du, PCHAR zu lesen????

    Macht keinen Sinn, propier ma

    "CopyrightStream.read(CopyrightRec.CopyrigtedStrin g[1], Len);"

    mfg cckLoud

  6. #16
    Registriert seit
    09.10.2006
    Ort
    Dresden
    Alter
    30
    Beiträge
    1.546

    Standard

    Das hat nix damit zu tun, ob man einen PChar^ oder den Pointer auf das erste Zeichen des Strings übergibt. Ist dasselbe.
    Und TStream interessieret sich nicht dafür, welhcer Type dahinter steht.

    @Delbor
    Du Hast beispielsweise folgende Datei (in Hex)
    Code:
    05 00 00 00 48 61 6C 6C 6F
    04 00 00 00 57 65 6C 74

    Dann liest du mit:
    Code:
    
    var Len:Integer;
    begin
      myFileStream.Read(Len,4);
    
    die ersten 4 Bytes ein und schreibst sie in Len (interpretierst sie also als Integer). Dann bekommst du eine 5 (Achtung: Little Endian):
    Code:
     05 00 00 00 
    Deswegen setzt du deinen string auf die Länge 5 und liest die nächsten 5 Zeichen ein:
    Code:
    
    //..
    
      SetLength(Str,Len);
      myFileStream.Read(Str[1],Len);
      //oder
    
      myFileStream.Read(PChar(Str)^,Len);
    
    Jetzt steht in Str "Hallo" drin. Wenn du das jetzt nochmal machst, wird Len das nächste Mal 4 enthalten und Str "Welt".

    Was passiert jetzt aber, wenn in der Datei folgendes steht:
    Code:
    43 6F 70 79 48 61 6C 6C 6F
    04 00 00 00 57 65 6C 74
    Dann ist in den ersten 4 Bytes eben, als Integer interpretiert, eben die Zahl2037411651 drin. Also ist in deiner Datei etwas falsch. Die eigentliche Dateilänge ist davon völlig unberührt.

    PS: Übrigens ist 43 6F 70 79 "Copy". Vielleicht sagt dir das irgendetwas.

    Eine Zeile Code sagt mehr als Tausend Worte

  7. #17
    Registriert seit
    06.06.2004
    Ort
    worms
    Alter
    55
    Beiträge
    3.126

    Standard

    High sirius,

    hast Recht, sowohl die Referenz auf CopyrigtedString[1] als auch pchar(CopyrigtedString) liefert die Adresse auf das 1. Zeichen des Strings!

    mfg cckLoud

  8. #18
    Registriert seit
    08.02.2005
    Ort
    St. Gallen / Schweiz
    Alter
    55
    Beiträge
    1.247

    Standard

    Hi Sirius

    Danke für deine gut detaillierte Antwort.

    Okay, in den ersten 4 Bytes steht die Länge als Integer. Dafür reservier ich 4 Byte
    Aber dann beginnt der String. Und der hat, wenn der Speichervorgang korrekt ablief, soviel Zeichen, wie die Zahl in den ersten vier Byte angibt. Und zwar jeweils an jeder einzelnen Position den Binärwert des Chars.
    • Für einen String der Länge 5 (Hallo) 5 x 1 Byte
    • Für einen String der Länge 10 (Hallo) 10 x 1 Byte
    Demnach ergeben sich verschieden grosse Dateien, je nachdem, was gespeichert werden soll.
    Was passiert jetzt aber, wenn in der Datei folgendes steht:
    43 6F 70 79 48 61 6C 6C 6F
    04 00 00 00 57 65 6C 74
    Klar muss da was in der Datei falsch sein.
    In der Datei?
    Wohl eher nicht, da sie nur mit dem einen Programm geschrieben und gelesen wird, also immmer mit demselben Code.

    Zitat Zitat von Delbor Beitrag anzeigen
    Grundsätzlich wäre es zwar Möglich, dass ich einfach die falsche Datei ausgelesen habe, doch das halte ich für sehr unwahrscheinlich:
    Code:
    ...(ExtractFilePath(Application.ExeName)+'Copyright.ini')
    Ok, als ich den Code das erste mal eingebaut hab, hab ich den Teil in den Klammern vergessen - und mich göttlich gewundert, dass in meinem Anwendungsverzeichnis überhaupt so eine Datei existiert..
    Der Teil in Klammern war das komplette 'ExtractFilePath(Application.ExeName)+', was nichts anderes heisst, als dass wahrscheinlich irgendwas ausgelesen wurde, nur nicht meine .ini. Die besagte Wahnsinnszahl könnte auch irgendein Zufallswert sein, wie ihn nicht initialisierte Integerwerte erhalten, also hätte er gar nicht in der Datei gestanden.
    Das andere ist, dass bei SetLength die Exception auftritt. Aber gerade das bringt mich eigentlich auf die Sache mit dem Zufallswert, da ein String länger sein könnte, als 2'037'411'651 Byte. Andersherum kann man SetLength nicht ohne Längenangabe aufrufen.
    PS: Übrigens ist 43 6F 70 79 "Copy". Vielleicht sagt dir das irgendetwas.
    Im Zusammenhang mit meinem 'Phänomen'? Nicht wirklich. Worauf willst du hinaus?

    Gruss
    Delbor
    http://www.delbor.ch

    Was wirklich zählt, ist Intuition. Albert Einstein

    ________________

    Delbor alias Zoran

  9. #19
    Registriert seit
    28.07.2001
    Ort
    Brüggemannsweg 1 46236 Bottrop
    Alter
    56
    Beiträge
    9.909

    Standard

    Zitat Zitat von Delbor Beitrag anzeigen
    Nicht wirklich. Worauf willst du hinaus?
    Das, was du für die Längenangabe hältst, ist der Text 'Copy' :
    Du hast geschrieben, die Länge wäre 2037411651, d.H. in Hex 79 70 6F 43. Jetzt umgedreht ( wegen little Endian ) : 43 6F 70 79
    Laut ASCII-Tabelle :
    43 : C
    6F : o
    70 : p
    79 : y
    Geändert von guinnes (09.02.2010 um 15:58 Uhr)
    Glückauf

    Herr, wirf Hirn vom Himmel

    Ein Leben ohne Möpse ist möglich, aber sinnlos ( Loriot )
    Der beste Platz für Politiker ist das Wahlplakat. Dort ist er tragbar, geräuschlos und leicht zu entfernen ( Loriot )

    Es gibt Leute, die fühlen sich überall gedemütigt, wo sie nicht frech sein dürfen ( Otto Weiss )

  10. #20
    Registriert seit
    08.02.2005
    Ort
    St. Gallen / Schweiz
    Alter
    55
    Beiträge
    1.247

    Standard

    Hi guinnes

    Danke für deine Antwort. Von Little Endian hab ich bis jetzt nichts mitgekriegt, bzw. es überlesen, da ich wirklich nichts damit anfangen konnte. Aber dank Onkel Google und Tante Wikipedia...
    Das bestätigt aber, dass da irgendwas gelesen wurde, das zufällig so hiess, wie meine Datei. Das heisst: irgendwohin gespeichert und irgendwo anders ausgelesen...
    Der Teil in Klammern war das komplette 'ExtractFilePath(Application.ExeName)+', was nichts anderes heisst, als dass wahrscheinlich irgendwas ausgelesen wurde, nur nicht meine .ini.
    So lernt man dazu...

    Gruss
    Delbor
    http://www.delbor.ch

    Was wirklich zählt, ist Intuition. Albert Einstein

    ________________

    Delbor alias Zoran

Ähnliche Themen

  1. Computer Sperren
    Von Mephisto090 im Forum Bastelecke
    Antworten: 5
    Letzter Beitrag: 09.02.2009, 10:08
  2. Werbung in dein Program einbinden
    Von termodox im Forum Off-Topic
    Antworten: 5
    Letzter Beitrag: 22.10.2008, 09:33
  3. Computer sperren
    Von Big_Boss im Forum Bastelecke
    Antworten: 21
    Letzter Beitrag: 16.11.2006, 17:51
  4. Schule und Computer..
    Von HdS im Forum Off-Topic
    Antworten: 35
    Letzter Beitrag: 23.11.2003, 14:25
  5. Lokale Netzwerk-Computer
    Von Anfaenger2002 im Forum Internet/Netzwerk
    Antworten: 4
    Letzter Beitrag: 17.07.2003, 20:41

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein