Entwickler-Ecke
Dateizugriff - BlockRead - Write Hilfe
Biarchiv - So 30.03.03 19:36
Titel: BlockRead - Write Hilfe
Hallo,
Wer kann mir mit Blockread and BlockWrite helfen. Ich will ZB eine Positon rauslesen. Diese Zahl soll dann mit einer anderen multipliziert werden. Zumindest verrechnet werden.
Quelltext
1: 2:
| Seek(f,lPos + 5); BlockRead(f,u,1,iRead); |
Wie kann ich da einen Byte so in einen String oder Integer reinnehmen und den dann addieren oder multiplizieren ,,??
Oderer Mehrere Byte positionen zusammen in einen String verbinden. Pos1: 66h Pos2: 55h Pos3: 22h Pos4: 11h in String: 66552211h Kann man diesen String dann auch verkert in eine Datei schreiben? Also nicht 66552211h sondern ab Position immer -1 11225566h Und von einer Position bis ende der Datei lesen und schreiben?
Danke...
Biarchiv - Mo 31.03.03 20:51
Hallo,
Grundsetzlich wie bekomme ich den Bytewert in einen String?
ert := File1.seek(u, 1);
ert = immer 1?? warum?
Wie bekomme ich den u Wert also ZB 55h in eine Dezimalzahl in einen String oder Integer
so das ich mit dem normal rechnen kann?
tommie-lie - Mo 31.03.03 21:12
Warum benutzt du da keine Streams?
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var File1: TFileStream; b: Byte; begin File1 := TFileStream.Create('C:\temp.tmp', fmCreate); b := 12; File1.Write(b, 1); File.Free; end; |
So schreibst du den Bytewert 12 in eine Datei. Da ein Byte immer ein Byte lang ist (häh... *g*) kannst du alle hintereinanderspeichern und brauchst nicht, wie bei Longstrings die Länge speichern.
Analog zum Lesen:
Quelltext
1: 2: 3:
| File1.Create('C:\temp.tmp', fmOpenRead); File1.Read(b, 1); File1.Free; |
Auch hier ist b wieder ein Byte und du kannst damit rechnen wie mit jeder anderen Variable auch.
Mehrere Zahlen lassen sich auch hintereinanderschreiben:
Quelltext
1: 2: 3:
| var b1, b2: Byte; File1.Write(b1, 1); File1.Write(b2, 1); |
Und für die grundsätzliche Frage, wie man an einen Bytewert in einem String kommt:
ord():
Quelltext
1:
| b := ord(mystring[1]); |
Für alles weitere über Streams (sind IMHO praktischer als "normale" Fiels) empfehle ich die Lektüre der Delphi Onlinehilfe.
Biarchiv - Mi 02.04.03 09:44
Hallo tommie-lie,
Vielen Dank für diese Infos. Mit denen hat alles funktioniert.
Nun habe ich ein paar kleine Fragen.
Wo liegt der unterschied zwischen der Variable byte und bytes?
Bei bytes können mehrere byte gespeichert werden? Wieviele.
So ich habe volgendes gemacht.
Quelltext
1: 2: 3: 4: 5:
| File1.seek(100, soFromBeginning); File1.read(byte4, 1); File1.read(byte3, 1); File1.read(byte2, 1); File1.read(byte1, 1); |
Wie bekomme ich jetzt Byte1 - 4 in einen Byte also
byteges := byte1 + byte2 + byte3 + byte4; // Das soll rauskommen 4 Bytes ZB.:00112233h
Wie kann ich dann diese 4 Bytes wieder zerlegen?
Also die 4 Bytes wieder in eine Byte Variable übergeben?
Kann man Bytes ZB 50 Bytes mit Wert 00h in eine Datei reinschreiben aber nicht
überschreiben sondern einfügen so das die File um 50Bytes größer wird?
Danke schon mal...
Delete - Mi 02.04.03 13:31
@Biarchiv: Ich glaube, du solltest dich mal in der Delphi-Hilfe mit den verschiedenen Integertypen und ihren Größen (Bereichen) befassen. Du gehst im Augenblick einen sehr umständlichen Weg.
Und bei aller Toleranz für Schreib- und Schusseligkeitsfehler: zumindest bei deinen Fragen solltest du dich um verständliche Formulierungen bemühen und sie nicht einfach so hinschludern. Ein wirklich gutes Beispiel aus deinem zweiten Posting:
| Biarchiv hat folgendes geschrieben: |
| Grundsetzlich wie bekomme ich den Bytewert in einen String? |
Ich hätte das mit
chr beantwortet, denn die Frage war ja nicht:
| Zitat: |
| Wie bekomme ich ein bestimmtes Byte (Zeichen) aus einem String? |
Aber so hat möglicherweise auch tommie-lie recht ... Man weiß eben nicht genau, was du eigentlich meinst.
So, jetzt aber -
| Zitat: |
| Oderer Mehrere Byte positionen zusammen in einen String verbinden. Pos1: 66h Pos2: 55h Pos3: 22h Pos4: 11h in String: 66552211h |
Ich nehme mal an, wenn du die Datei in einem Hex-Editor ansiehst, dann sieht das so aus:
Dann frage ich mich, warum du mit vier Bytes arbeiten willst. Wenn du 100% sicher bist, dass diese 4 Bytes zusammen
eine Zahl ergeben, dann benutze einen 32-Bit-Wert (integer, cardinal, longint, longword). Um bei deinem BlockRead-Beispiel zu bleiben:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var lWert : longint; begin { ... }
Seek(f,lPos + 5); BlockRead(f,lWert,sizeof(lWert),iRead);
{ ... } |
Voilà. Damit hast du die vier einzelnen Bytes auf einen Schlag gelesen, und -man höre und staune!- sie bilden sogar die Zahl, die du erst mühsam errechnen wolltest.
Dazu muss allerdings gesagt werden, dass Windows beim Speichern und Lesen von solchen Daten grundsätzlich immer das niederwertigste Byte
zuerst benutzt. Das heißt, tatsächlich ist die gelesene Zahl nicht $66552211 sondern $11225566 (um bei den Hex-Werten zu bleiben).
Irgendwie habe ich jetzt ein Deja vù ... Also habe ich das wohl schon mal erwähnt. Egal. Wenn man gleich die richtigen Typen benutzt, dann muss man sich nicht um solche Sachen kümmern, weil dafür das Betriebssystem im Hintergrund zuständig ist.
| Zitat: |
Wie bekomme ich jetzt Byte1 - 4 in einen Byte also
Quelltext 1:
| byteges := byte1 + byte2 + byte3 + byte4; // ZB.:00112233h | |
Dieser Ansatz wäre definitiv falsch!
Ein Byte liegt nur im Bereich von 0 bis 255. Addierst du mehrere Bytes, dann ist es durchaus möglich, dass der Maximalwert (255) überschritten wird. Deklarierst du die Ergebnisvariable nun aber auch als Byte, wird die errechnete Zahl niemals stimmen. Du musst also einen Typ wählen, der groß genug ist.
Außerdem dürfen in diesem Fall die Bytes nicht einfach so addiert werden. Denk doch nur mal an den Wert 256. Der sähe in einem Hex-Editor so aus:
Würdest du diese vier Bytes einfach nur addieren, kämst du logischerweise auf den Wert Eins (0+1+0+0). Du musst beim "Zusammenrechnen" auch den Grundwert
(mir fällt gerade der korrekte Begriff nicht ein; wer ihn weiß, bitte ergänzen!) jedes Bytes berücksichtigen, damit am Ende die gewünschte Zahl herauskommt. Richtig wäre in diesem Fall daher eine Rechnung wie
Quelltext
1:
| Ergebnis := byte1 + ($100 * byte2) + ($10000 * byte3) + ($1000000 * byte4); |
oder (eleganter)
Quelltext
1:
| Ergebnis := byte1 + (byte2 shl 8) + (byte3 shl 16) + (byte4 shl 24) |
oder (einfacher)
Quelltext
1:
| Ergebnis := MAKELONG(MAKEWORD(byte1,byte2),MAKEWORD(byte3,byte4)); |
| Zitat: |
| Wie kann ich dann diese 4 Bytes wieder zerlegen? |
Zum Zerlegen würde ich HIWORD/LOWORD und HIBYTE/LOBYTE empfehlen. Am Beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var iInt : longint; begin iInt := $11225566; // ==---> niederwertiges Byte im niederwertigen Word // ==-----> höherwertiges Byte im niederwertigen Word // ==-------> niederwertiges Byte im höherwertigen Word // ==---------> höherwertiges Byte im höherwertigen Word
ShowMessage( inttohex(LOBYTE(LOWORD(iInt)),2) + #32 + // = $66 inttohex(HIBYTE(LOWORD(iInt)),2) + #32 + // = $55 inttohex(LOBYTE(HIWORD(iInt)),2) + #32 + // = $22 inttohex(HIBYTE(HIWORD(iInt)),2) // = $11 ); end; |
Gruß.
ShadowCaster - Fr 04.04.03 10:16
lol... FileStreams... back to the roots ;) ich sag besser nix...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!