 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
code
Anmeldungsdatum: 19.01.2005 Beiträge: 154
|
Verfasst am: 09.02.2005, 15:58 Titel: einzelne Bits in Dateien schreiben |
|
|
Ich habe ein problem, und zwar möchte ich einzelne Bits in eine Datei schreiben. weiß jemand wie das funktioniert?
danke schon mal für die antworten. |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 09.02.2005, 16:28 Titel: |
|
|
Leider überhaupt nicht.
Das einzige, das du anstellen kannst, ist ein einzelnes BYTE zu schreiben. Das ist dann aber auch schon kein Problem mehr.
Mal angenommen, du hättest die Variable x, die entweder 0 oder ein sein kann. Das würde dann nämlich deinem Bit-Problem entspreichen.
Dann schreibst du einfach:
Code: |
OPEN "DATEI.DAT" FOR BINARY AS #1
PUT #1, , x
CLOSE 1
|
und fertig.
und wenn du x dann wieder einlesen willst, schreibst du statt der PUT-Zeile einfach
GET #1, ,x
Jetzt nehmen wir einmal an, du hättest mehrere Variablen, die zwischen 1 und 0 schwanken können.
Für jede von ihnen ein ganzes Byte zu benutzen wäre Verschwendung!
Deswegen benutzen wir nur eine Variable.
In einem Byte kannst du nämlich bist zu 8 Bits unterbringen. (Der Bereich einer INTEGER-Variable reicht von -32768 bis 32767, fasst also ganze 16 Bit, allerdings ist es ein wenig schwierig zu handhaben, weil du beim setzen des Bit 15 einen Negativen Wert erzeugen musst... außerdem brauchst du dann in der Datei 2 Byte... aber ich glaube, das brauchst du sowiso, weil du in QB eine Variable nicht als Byte definieren kannst....)
Also, der Code wäre dann in etwa:
Code: |
bit0 = 1
bit1 = 0
bit2 = 1
bit3 = 0
bit4 = 1
bit5 = 0
bit6 = 1
bit7 = 0
byte = bit0 * 2 ^ 0
byte = byte + bit1 * 2 ^ 1
byte = byte + bit2 * 2 ^ 2
byte = byte + bit3 * 2 ^ 3
'.... u.s.w...
OPEN "DATEI.DAT" FOR BINARY AS #1
PUT #1, ,byte
CLOSE 1
|
Siehst du, wie einfach das geht?
generell also:
byte = byte + BitX * 2 ^ X
Deswegen bietet es sich auch an, die Bits in einem Array zu speichern, weil man dann einfach per FOR-NEXT schleife umwandeln könnte...:
Code: |
DIM Bits(7) AS INTEGER
'... hier werden die Bits gesetzt...
DIM Byte AS INTEGER
FOR i = 0 TO 7
byte = byte + Bits(i) * 2 ^ i
NEXT
OPEN "DATEI.DAT" FOR BINARY AS #1
PUT #1, ,byte
CLOSE 1
|
Viel spaß mit dem Code!
(Anmerkung: Ich glaube, dass es mit INP/OUT eigentlich möglich sein sollte, Dateinen direkt zu beeinflussen, und so auch einzelne Bits schreiben könnte, aber das ist bestimmt wahnsinnig kompliziert... verlass dich lieber auf den QB-Befehlssatz, und benutze BYTEs)
(Anmerkung2: In freeBASIC kannst du auch unsigned Variablen benutzen, was sich für so eine Aufgabe bestens eignet!) _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 09.02.2005, 16:36 Titel: |
|
|
Das habe ich mir jetzt mal so ausgedacht, ohne es groß zu testen.
In der Variablen BitPosition sollte natürlich die Position des Bits in der Datei stehen, wobei das erste Bit der Datei auf der position 0 steht!
Code: | DIM Byte AS STRING * 1
DIM BitPosition AS LONG
OPEN ... FOR BINARY AS #1 LEN = 1
'*** Bit auf 1 setzen ***
GET #1, BitPosition \ 8 + 1, Byte
Byte = CHR$(ASC(Byte) OR (2 ^ (BitPosition MOD 8)))
PUT #1, BitPosition \ 8 + 1, Byte
'*** Bit auf 0 setzen ***
GET #1, BitPosition \ 8 + 1, Byte
Byte = CHR$(ASC(Byte) AND (255 - 2 ^ (BitPosition MOD 8)))
PUT #1, BitPosition \ 8 + 1, Byte |
|
|
Nach oben |
|
 |
code
Anmeldungsdatum: 19.01.2005 Beiträge: 154
|
Verfasst am: 09.02.2005, 17:07 Titel: |
|
|
danke für die antworten.
mein projekt das ich machen will, abgesehen davon das es eigentlich schwachsinning ist, ist einen "compiler" für maschienensprache zu programmieren.
also man hat einen editor wo man 1 und 0 schreiben kann. danach werden diese in eine datei geschrieben und als exe gespeichert.
immer acht zahlen geben ein byte, aber was ist nun, wenn am ende
nur noch 4 bit (=zahlen) übrigbleiben? oder besteht eine exe datei nur aus vollen bytes?
ihr seht eigentlich ist dieses Projekt schwachsinn, aber ich wollte mal wissen ob man direkt in maschienensprache programmieren kann.  |
|
Nach oben |
|
 |
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 09.02.2005, 17:14 Titel: |
|
|
Wieso nimmst du nicht HEX ? Jeder bessere Systemeditor benutzt Hex Damit kannst du in zwei Zeichen ein Byte Darstellen (FFh=255, 00h=0)
Nix mit 4bits...alle PCs sind für 8bit ausgelegt, das ist schon seit Urzeiten so. Du kannst immer nur mit mindestens 1 Byte operieren. _________________
 |
|
Nach oben |
|
 |
code
Anmeldungsdatum: 19.01.2005 Beiträge: 154
|
Verfasst am: 09.02.2005, 17:27 Titel: |
|
|
ok danke das wollte ich wissen. also dann werd ich mich mal hinsetzten und zu programmieren anfangen. |
|
Nach oben |
|
 |
Bender

Anmeldungsdatum: 30.12.2004 Beiträge: 18
|
Verfasst am: 09.02.2005, 22:35 Titel: |
|
|
Wie wärs denn mit dezimal? oder auch als byte...wenn du nur 4 bit zb. am schluss übrig hast kannst du doch trotzdem ein Byte schreiben, nur sind halt die ersten 4 Bit=0 ??? |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|