Bits in Datei schreiben

01/21/2012 14:48 butter123#1
Hallo Leute,

wollte jetzt grade das Thema Datein schreiben vertiefen. Hierzu wollte ich einzelne Bits in eine Datei schreiben und sie anschließend wieder auslesen.

Mit FileWrite() kann ich nur ganze Bytes schreiben. Geht es irgendwie anders?


lg
Butter
01/21/2012 14:57 Croco™#2
Schau dir mal
Quote:
StringToBinary
und
Quote:
BinaryToString
vl. ist es das was du meinst
01/21/2012 15:25 lolkop#3
Quote:
Originally Posted by butter123 View Post
Hallo Leute,

wollte jetzt grade das Thema Datein schreiben vertiefen. Hierzu wollte ich einzelne Bits in eine Datei schreiben und sie anschließend wieder auslesen.

Mit FileWrite() kann ich nur ganze Bytes schreiben. Geht es irgendwie anders?


lg
Butter
das hex-, wie auch das binärsystem sind doch nur unterschiedliche schreibweisen für zahlen o0

willst du eine binärzahl schreiben, wandle diese halt vorher in die entsprechende hexadezimale darstellung um.
01/21/2012 20:49 xShizoidx#4
Du möchtest einfach nur die Bytes von Dateien in eine Textdatei schreiben, habe ich dies richtig verstanden? Wenn ja, wieso nicht die ganze Bytesanzahl?
Du könntest den Pfadname der Datei auslesen, davon den String so spliten, dass nur noch der Dateiname überbleibt und anschließend die Bytes auslesen und dieses Beides in eine Textdatei schreiben.
Das könnte z.B. so in der Textdatei aussehen :
Dateiname "Beispiels.txt" Bytes "3151232"
Dann könntest du jede Linie einzeln mit _FileReadLine auslesen und die Infos mit _StringBetween herausfiltern um sie dann weiter zu verwenden.
01/21/2012 21:37 butter123#5
Nein, ich möchte wirklich nur die Bits schreiben ;) Also keinen String mit "11011101" wo dann in der Datei mit Unicode das steht, sondern so dass wirklich die ganze Datei nur hier 8 Bits lang ist. Also so, dass mir der Texteditor warscheinlich garnichts anzeigt, weil er versucht daraus einen Buchstaben zu lesen. Und es muss auch keine txt sein, kann auch eine .auiawdb sein^^

@lolkop: kannst du mir ein Beispiel geben, ich wüsste jetzt nicht, wie ich das anwenden sollte^^
Datei im binary Modus mit FilOpen öffnen und dann was in Hex reinschreiben?
01/21/2012 23:32 MoepMeep#6
Quote:
Originally Posted by butter123 View Post
Nein, ich möchte wirklich nur die Bits schreiben ;) Also keinen String mit "11011101" wo dann in der Datei mit Unicode das steht, sondern so dass wirklich die ganze Datei nur hier 8 Bits lang ist. Also so, dass mir der Texteditor warscheinlich garnichts anzeigt, weil er versucht daraus einen Buchstaben zu lesen. Und es muss auch keine txt sein, kann auch eine .auiawdb sein^^

@lolkop: kannst du mir ein Beispiel geben, ich wüsste jetzt nicht, wie ich das anwenden sollte^^
Datei im binary Modus mit FilOpen öffnen und dann was in Hex reinschreiben?
8Bits sind 1Byte. Bytes kannste schreiben, wo ist das problem?
01/21/2012 23:35 lolkop#7
willst du wirklich einen binären string in die datei schreiben, so musst du diesen string vorher in eine zahl umwandeln.

das könnte man zb mit einer einfachen rekursiven funktion machen. hier ein beispiel:
Code:
Func BinToDec($bin, $dec=0, $cntr=0)
	If $bin='' Then Return $dec
	Return BinToDec(StringTrimRight($bin,1), $dec+StringRight($bin,1)*2^$cntr, $cntr+1)
EndFunc

ConsoleWrite(BinToDec("11111110")&@CRLF)
somit hast du stets ein byte, welches du schreiben könntest. im normalfall hat man aber bereits die bytes gegeben, welche man schreiben bzw lesen möchte. da du ja die binären operationen auch nur über zahlen anwenden kannst, ist es unüblich mit strings von binären zahlen zu arbeiten.
01/22/2012 00:03 butter123#8
Ok, ich versuchs nochmal zu beschreiben :D

Habe die Datei test.abc . Wenn ich sie mit dem Editor öffne, steht da "abc" als String drin. Grundlegend besteht die Datei aber aus Bits. Hier insgesammt 24, also 3 Byte (ein Byte Pro Char). Jetzt will ich aber ein neues Dateiformat, was nicht für den Editor, sondern für ein anderes Programm ist.

Schreibe ich mit Autoit "1" (Hier noch als Sting oder Int) rein, ist die Datei 1 Byte groß. In Hex steht da drin 0x00000001. Würde ich 1111 schreiben wollen, würde in der Datei das von grade eben 4 mal stehen. Für das Beispiel von oben 8 mal. Viel zu viel um ressourcenspaarend zu sein.
Also möchte ich, dass wenn ich 1 reinschreiben nur 0x1 drinsteht, oder beim Beispiel von oben 0x0F10010F (habs jetzt nicht umgerechnet). Die 1 die ich reinschreibe ist nichtmehr vom Typ String oder Int, sondern Bit. Ein Bit kann nur 0 oder 1 sein und nicht 2 oder a.

Also wäre die Datei mit dem Inhalt 0x0F10010F genau 1 Byte groß.


Ich hoffe jetzt ist es klarer^^
01/22/2012 00:08 MoepMeep#9
Nur schade, dass man nichts kleineres als 1Byte speichern kann. Je nach Dateisystem(ich vermute sogar bei jedem) nimmt deine 1Byte Datei sogar mehr als 1Byte Speicherplatz weg. Du versuchst hier an der vollkommen falschen Stelle zu sparen.
01/22/2012 00:16 butter123#10
Hmm ok. Und wie kann ich einen Byte speichern? Ich möchte jetzt bspw. die Zahl 16 in einem Byte speichern. Ein Byte kann ja 256 unterschiedliche Werte haben umgerechnet in Dez.
01/22/2012 00:22 MoepMeep#11
FileWrite? Steht in deinem 1. post :p 16 in hex ist 10.
01/22/2012 00:49 lolkop#12
ich hatte doch bereits gesagt, das autoit zahlen als dword/int automatisch behandelt. diese sind unter windows exakt 4 byte groß. willst du nur ein byte nutzen, musst du das ganze mit binären befehlen bearbeiten.

bsp:
Code:
$hwnd = FileOpen('text.txt', 18)
FileWrite($hwnd, BinaryMid(1,1,1))
FileClose($hwnd)
schreibt 0x01 als ein byte in die datei.
01/22/2012 01:04 butter123#13
werd ich hjeute mal irgendwann auspribeiren danke :)
01/22/2012 01:24 MoepMeep#14
Quote:
Originally Posted by lolkop View Post
ich hatte doch bereits gesagt, das autoit zahlen als dword/int automatisch behandelt. diese sind unter windows exakt 4 byte groß. willst du nur ein byte nutzen, musst du das ganze mit binären befehlen bearbeiten.

bsp:
Code:
$hwnd = FileOpen('text.txt', 18)
FileWrite($hwnd, BinaryMid(1,1,1))
FileClose($hwnd)
schreibt 0x01 als ein byte in die datei.
Kann man bei AutoIt nicht direkt 0x01 angeben? Also FileWrite($hwnd,0x01)
01/22/2012 01:49 lolkop#15
Quote:
Originally Posted by MoepMeep View Post
Kann man bei AutoIt nicht direkt 0x01 angeben? Also FileWrite($hwnd,0x01)
doch schon aber autoits automatische typen analyse macht aus der eingabe 0x1(hex) automatisch 1(dec). und 1(dec) wird binär wieder als dword ausgewertet und somit wird 0x00000001 gespeichert.