Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

einzelne Bits in Dateien schreiben

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
code



Anmeldungsdatum: 19.01.2005
Beiträge: 154

BeitragVerfasst am: 09.02.2005, 15:58    Titel: einzelne Bits in Dateien schreiben Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 09.02.2005, 16:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 09.02.2005, 16:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
code



Anmeldungsdatum: 19.01.2005
Beiträge: 154

BeitragVerfasst am: 09.02.2005, 17:07    Titel: Antworten mit Zitat

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. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Paul
aka ICC, HV-Freak


Anmeldungsdatum: 11.09.2004
Beiträge: 588
Wohnort: Uelzen

BeitragVerfasst am: 09.02.2005, 17:14    Titel: Antworten mit Zitat

Wieso nimmst du nicht HEX ? Jeder bessere Systemeditor benutzt Hex durchgeknallt 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
code



Anmeldungsdatum: 19.01.2005
Beiträge: 154

BeitragVerfasst am: 09.02.2005, 17:27    Titel: Antworten mit Zitat

ok danke das wollte ich wissen. also dann werd ich mich mal hinsetzten und zu programmieren anfangen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bender



Anmeldungsdatum: 30.12.2004
Beiträge: 18

BeitragVerfasst am: 09.02.2005, 22:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz