Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stream/Datei bitweise lesen + schreiben (https://www.delphipraxis.net/38682-stream-datei-bitweise-lesen-schreiben.html)

stoxx 22. Jan 2005 19:13


Stream/Datei bitweise lesen + schreiben
 
Hallo !

hat jemand sowas schonmal umgesetzt ? Also ich meine nicht, dass ich Byteweise eine Datei auslesen kann.
sonder z.B.

ich möchte 3 Bits lesen, danach eine Integer Zahl. Danach 1 Bit, danach 5 Bits, dann wieder ein Byte.
usw ..

SirThornberry 22. Jan 2005 19:15

Re: Stream/Datei bitweise lesen + schreiben
 
tut mir leid dich enttäuschen zu müssen aber das geht nicht. Du kannst höchstens byteweise schreiben. du müsstest also vorher im speicher per bitoperation das ganze mindestens auf bytegröße zusammenbauen bevor du das ganze schreibst/liest

in deinem beispiel müsstest du also 1Byte + 4Byte(Unteger) + 1Byte lesen damit du den integer vollständig hast. und dann musst du bits shiften um an den Integer richtig ranzukommen

Binärbaum 22. Jan 2005 19:20

Re: Stream/Datei bitweise lesen + schreiben
 
So einfach geht das nicht. Die kleinste Einheit, die man aus einer Datei lesen oder schreiben kann ist ein Byte (also 8 Bit). Demzufolge müsste man also immer mindestens ein Byte lesen und dieses dann selbst in die einzelnen Bits zerlegen. Beim Schreiben passiert das selbe in umgekehrter Reihenfolge. Und darum muss man sich als Programmierer selbst kümmern, da mir keine schon von vornherein in Delphi vorhandene Funktion bekannt ist, die das macht.

Edit:
@Thornberry: Da war wohl jemand schneller als ich.

MfG
Binärbaum

Sebastian Nintemann 22. Jan 2005 19:30

Re: Stream/Datei bitweise lesen + schreiben
 
Wenn ich dich richtig verstanden habe, möchtest du also zb. 3 Bit haben mit irgendwelchen Informationen, dann einen Integer (32 Bit) direkt dahinter usw?
Du solltest immer in ganzen bytes schreiben, also wären zwischen den 3 Bit und dem Integer 5 unbenutzte bits. Alles andere wäre IMHO wenig sinnvoll. Also ein ganzes byte benutzen, auch wenn du unter Umständen nur 1 bit davon benutzt. Eine boolean Variable ist ja auch 1 byte groß, obwohl (in der Regel) nur 1 bit davon wirklich einen Sinn hat. Das entsprechende byte musst du dann halt mit den bitweisen Operatoren (shr, shl, and, or, ...) nach deinen Wünschen manipulieren.
Falls es dir aber lediglich um das Lesen einer bereits bestehenden Datei, die du nicht selbst erzeugst geht, und diese z.B. Integer über byte-Grenzen hinweg speichert (außer natürlich die Grenzen zwischen ihren 4 byte, ihr wisst schon was ich meine), was ich aber kaum glaube, dann hilft halt nur friemeln ;)

Viele Grüße,
Sebastian

stoxx 22. Jan 2005 19:38

Re: Stream/Datei bitweise lesen + schreiben
 
Zitat:

Du solltest immer in ganzen bytes schreiben, also wären zwischen den 3 Bit und dem Integer 5 unbenutzte bits.
Genau das wollte ich eben nicht !! ;-)

ich glaub aber, ich hab da was gefunden.



Bitweises Ein und Auslesen von Dateien


Danke an alle :-)

Sebastian Nintemann 22. Jan 2005 19:44

Re: Stream/Datei bitweise lesen + schreiben
 
Zitat:

Genau das wollte ich eben nicht !!
Warum nicht? Alles andere macht die Sache doch nur komplizierter! Und ein Speicherproblem solltest du auch nicht so schnell bekommen, so viele ungenutzte bits werden es ja kaum sein. Auf jeden Fall stehen die in keinem Verhältnis zu dem Mehraufwand den du dir dann machst (und auch nicht zur größeren Exe-Dateigröße ;) ). Naja, ich weiß ja nicht, was du vorhast zu speichern.
Wenn die Datei nicht von dir kommt ist das natürlich was anderes ;)

Viele Grüße,
Sebastian

Binärbaum 22. Jan 2005 19:45

Re: Stream/Datei bitweise lesen + schreiben
 
Zitat:

Zitat von Sebastian Nintemann
Also ein ganzes byte benutzen, auch wenn du unter Umständen nur 1 bit davon benutzt.

Also diese Variante würde zwar das Schreiben in eine Datei vereinfachen, aber beim Lesen müsste man dann immer noch Bits shiften, wenn wie im Beispiel nur 3 Bit und dann ein Integer (32 Bit) in der Datei stehen. Außerdem würde durch diese Methode der Speicherbedarf einer solchen Datei auf das Achtfache steigen, wenn immer nur ein Bit genutzt wird. Bei kleineren Dateien ist das ja noch zu verkraften, aber bei mehreren MB Daten wirds schon kritisch. :? Darum sollte man die alle Bits nutzten, auch wenn der Programmieraufwand erstmal höher ist: beim Speicherbedarf zahlt sich das aus.

MfG
Binärbaum

stoxx 22. Jan 2005 19:50

Re: Stream/Datei bitweise lesen + schreiben
 
um es vielleicht kurz zu erklären, ich speicher Tickdaten von Aktien, Futures und sonstiges.
Da mein Datenvolumen von 20 GB leider etwas zuviel wird, und ich noch nichtmal den Bid / Ask Datenstrom gespeichert habe.
Wird also etwas haarig.
Kümmer mich nun um eine effizientere Datenspeicherung.

Auf der Seite ist übrigens eine gute Beschreibung dieser Verfahren .. mal schauen, ob das so klappt, wie ich mir vorstelle ..

http://www-user.tu-chemnitz.de/~mfie/compproj/

Sebastian Nintemann 22. Jan 2005 19:55

Re: Stream/Datei bitweise lesen + schreiben
 
Hallo Binärbaum,
wie oben schon gesagt glaube ich kaum, dass es so viele Bits sind, die ungenutzt bleiben. Hat man mehrere Flags kann man diese ja auch in einem Byte zusammenfassen (zb. bit eins steht für eine Option, bit 2 für eine andere usw). Sind es tatsächlich so viele ungenutzte Bits, sollte man vielleicht auch mal über den Aufbau der Datei nachdenken.

Zitat:

Also diese Variante würde zwar das Schreiben in eine Datei vereinfachen, aber beim Lesen müsste man dann immer noch Bits shiften, wenn wie im Beispiel nur 3 Bit und dann ein Integer (32 Bit) in der Datei stehen.
Gerade eben nicht ;) Du liest beispielsweise das erste byte der Datei, von der meinetwegen die ersten drei bits Informationen enthalten. Welche bits gesetzt sind kann man leicht über Bitmasken prüfen. Danach liest du ganz normal über die Read Methoden weiter aus dem Stream (beispielsweise 4 byte als Integer). Da muss dann eben nicht geshiftet werden. Du benutzt einfach die entsprechenden Methoden und den Schreib/Lese Offset den dir die Streamklasse (falls du Streams benutzt) zur verfügung stellt.

Viele Grüße,
Sebastian

stoxx 22. Jan 2005 20:06

Re: Stream/Datei bitweise lesen + schreiben
 
Hi Sebastian,

ja, so habe ich mir das auch schon überlegt. Aber genau dieses "Begin" Byte ist wahrscheinlich schon 4 -5 Bit zu groß ;-)
4 Bit mehr auf 1 000 000 Ticks sind schon 488 kb.

Nur Zip komprimiert den Datenstrom etwa 1:3 .. rar wäre besser, aber ist ja nicht bekannt ;-)
Nun will ich mir selber was basteln, da ich ja das Datenformat am besten kenne und effizient "komprimieren" kann.

5 Bit Zahlen schwirren nämlich auch in meinen Gedanken herum ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr.
Seite 1 von 2  1 2      

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