Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 25

Thema: Rechnen und Ausgeben von Binärcodes

  1. #1
    Registrierter Benutzer
    Registriert seit
    20.10.2005
    Beiträge
    12

    Rechnen und Ausgeben von Binärcodes

    Moin,

    ich will einem EPROM multiplizieren beibringen, und zwar je 8 Bit mit 8 Bit. Das Ergebnis soll wieder auf 8 Bit gekürzt werden (natürlich auf die 8 höherwertigen Bit). Hierfür brauche ich einfach nur eine Binärdatei(!! keine ASCII oder Hex-Datei!) mit allen möglichen Multiplikationen (sind 65536 mögliche Kombinationen..) und genau dafür will ich ein C-Programm schreiben. Nun programmiere ich im Allgemeinen eher µCs und habe null Plan, wie ich eine Binärdatei erzeugen kann. Auch wollen meine bisherigen Versuche die Binärzahlen nicht richtig multiplizieren (was vielmehr daran liegt, dass ich keine Ahnung habe, wie ich die richtig ausgeben muss.. :/).

    Nun wäre ich sehr dankbar, wenn mir hier jemand ein Beispielprogramm zum Rechnen mit Binärzahlen schreiben würde und mir möglicherweise auch gleich erklären könnte, wie ich die Binärdatei erstellen könnte (wichtig dabei ist auch, dass die Datei nicht jedesmal überschrieben werden soll, sondern jeder Wert eine neue Zeile bekommen muss).
    Geändert von kundesbanzler (22-10-2005 um 17:30 Uhr)

  2. #2
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Die Multiplikation im Binärsystem läuft mit den Shiftoperatoren und wenn Du die ganzen Ergebnisse in einer Binärdatei speichern willst, dann musst Du zum Schreiben die Funktion fwrite benutzen anstatt fputc oder fprintf.

    Am einfachsten ist es erstmal, die Zahlen alle dezimal zu multiplizieren und dann die Ergebnisse in Binärzahlen umzuwandeln.
    Das geht mit einem Bitmaskenvergleich mit besagtem Shiftoperator:

    Du nimmst die Dezimalzahl und die Zahl 1. Dann schiebst Du bei der 1 die 1 von der niedrigsten auf die höchste Stelle und dann machst Du in einer Schleife einen binären Vergleich der Maske mit der Zahl und shiftest die 1 wieder runter.

    So könntest Du die Zahl binär ausgeben. Die Speicherung kannst Du z.B. in einem struct machen oder in einem Array und das dann in die Datei schreiben
    Geändert von SeeksTheMoon (20-10-2005 um 21:02 Uhr)
    I haven't lost my mind - It's somewhere on a backup-disc

  3. #3
    Registrierter Benutzer
    Registriert seit
    20.10.2005
    Beiträge
    12
    Also wenn ich das richtig verstanden habe, schiebe ich einfach die 1 so lange, bis die dez-Zahl nicht mehr durch die bin-Zahl teilbar ist. Wenn ich das erreicht habe, schiebe ich die 1 wieder um eins nach rechts und füge eine neue 1 ein, durch die ich dann den Rest der ersten Division (wieder mit hin-und-her schieben) dividiere, bis der Rest 0 ist? Hmm.. Also wenn ich das jetzt nicht komplett falsch verstanden habe, verstehe ich zumindest mal das Prinzip.. Kann ich das hin-und-her-schieben nicht auch am einfachsten mit einem Array realisieren?

    Die andere Frage wäre: wie definiere ich eine Binärzahl? Hab' darüber nichts gefunden, einfach mit 0x00100010 (als Bsp.)? die muss dann auch als unsigned char gespeichert werden, sonst wird mir das Binärfile zu groß, oder speichert fwrite sowieso alles im Binärformat ab, unabhängig vom Datentyp?

    Aber danke erstmal, werde mich dann gleich morgen wieder dransetzen

  4. #4
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    fwrite speichert immer binär, die anderen immer Text.

    Du machst keine Division durch die 1-Zahl (Bitmaske), sondern einen binärvergleich:

    Du hast zuerst 0000 0001, das ist 1. Dann schiebst Du die 1 ganz nach links (<<), so dass Du 1000 0000 hast und dann benutzt Du einen Binärvergleich (&) mit Deiner Dezimalzahl (dem Rechenergebnis).
    Im Rechner sieht das dann z.B. so aus:
    erster Schritt:
    Code:
       1001 0110      <- unbekanntes Ergebnis in interner Darstellung
    &  1000 0000      <- unsere Bitmaske
    Vergleich ist 1, also true, weil an beiden Stellen eine 1 steht. Die erste Zahl im Array wird eine 1.
    Die Bitmaske einmal nach rechts shiften (>>) und wieder vergleichen:
    Code:
       1001 0110
    &  0100 0000
    diesmal 0, false -> nächste Zahl im Array wird 0 usw.

    Der & Operator funktioniert wie ein UND-Gatter: Sind zwei Einser da, kommt 1 raus, sonst nicht.
    I haven't lost my mind - It's somewhere on a backup-disc

  5. #5
    Registrierter Benutzer
    Registriert seit
    20.10.2005
    Beiträge
    12
    Das mit fwrite ist schonmal gut zu wissen, danke

    Und ich kann eine Dezimalzahl wirklich mit dieser Bitmaske UND-verknüpfen? Hab ich das richtig verstanden? (sry, hab's normalerweise mehr mit µCs, da hab' ich selten solche Probleme..).

  6. #6
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    sicher, dafür ist der Operator ja da. Die Dezimalzahl und die 1 haben auch den gleichen Datentyp, da ist das eh kein Problem.
    Falls Du float-Zahlen binär umwandeln willst, dann wird es etwas wilder, weil deren interner Aufbau ja etwas wilder ist.
    I haven't lost my mind - It's somewhere on a backup-disc

  7. #7
    Registrierter Benutzer
    Registriert seit
    20.10.2005
    Beiträge
    12
    So, hab ein wenig herumexperimentiert und bin am Ende irgendwie doch auf Binärzahlen gekommen. Allerdings ohne den UND-Operator, aber mit einem Ähnlichen Verfahren. Die Ausgabe mit printf funktioniert hier tadellos, aber mit fwrite habe ich noch Probleme. Und zwar lässt sich das c-File normal kompilieren, aber nicht ausführen, ich bekomme nur die Meldung "Speicherzugriffsfehler"..

    Ich hänge die Datei mal an (sitze hier leider an einem Windowsrechner, der formatiert die Datei grauenhaft, sonst würde ich sie hier reinkopieren), wäre super wenn es mal jemand ausprobieren könnte.

    Achja, kann es sein, dass dieser Speicherzugriffsfehler damit zusammenhängt, dass ich das alles unter Knoppix kompiliere? Habe hier leider keinen Linux-Rechner, bin erst ab morgen Abend wieder zuhause..

    So, hoffe, das mit dem Anhang funktioniert und lässt sich auch im VI-Editor oä. richtig darstellen..

    Danke schonmal im Voraus

  8. #8
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Du benutzt den sizeof operator nicht korrekt:
    Normalerweise müsste es sizeof(d) heißen, aber das sollte der Compiler eigentlich anmeckern.
    Ansonsten sieht die Dateiverarbeitung auf den ersten Blick richtig aus.

    Was ich nicht verstehe: Wenn die zahl 8 Bit hat, warum nimmst Du dann nur ein Array der Größe 7?
    I haven't lost my mind - It's somewhere on a backup-disc

  9. #9
    Registrierter Benutzer
    Registriert seit
    20.10.2005
    Beiträge
    12
    Hmm, ja, das mit dem kleinen Array war von Anfang an irgendwie Falsch. Hab' an 0-7 gedacht und den Fehler danach nicht mehr bemerkt; komischerweise ging es mit printf trotzdem

    Danke für den Hinweis auf sizeof(d), es hat leider nichts geholfen. Naja, ich werde das ganze bis heute Abend ruhen lassen und dann auf einem installierten Linux-System ausprobieren. Wahrscheinlich liegt's eh am Knoppix.

    Auf jeden Fall vielen Dank für deine Hilfe!

  10. #10
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    ich will einem EPROM multiplizieren beibringen, und zwar je 8 Bit mit 8 Bit. Das Ergebnis soll wieder auf 8 Bit gekürzt werden (natürlich auf die 8 höherwertigen Bit). Hierfür brauche ich einfach nur eine Binärdatei(!! keine ASCII oder Hex-Datei!) mit allen möglichen Multiplikationen (sind 65536 mögliche Kombinationen..)
    Hmm... willst du die wirklich alle abspeichern? Ich kenne ehrlich gesagt keinen Mikrocontroller, der so viel EEPROM-Platz hat, aber nicht auch 8 Bit multiplizieren könnte.

  11. #11
    Registrierter Benutzer
    Registriert seit
    22.03.2001
    Beiträge
    650
    In einem externen Speicher wie einer MMC oder SDC kann man sowas unterbringen. Man kann natürlich auch sowas wie einen ARM9-Prozessor mit reichlich RAM, Flash und einigen hundert Megahertz Takt nehmen, aber wegen den langsamen Speicher-Zugriffen ist eine Funktion sicherlich schneller.

  12. #12
    Registrierter Benutzer
    Registriert seit
    20.10.2005
    Beiträge
    12
    Nein, ich will einfach nur einen EPROM (sogar noch einen alten UV-EPROM) mit 512kbit Speicher mit dem File füttern. Der braucht nur multiplizieren können, das ganze soll als eine Art Laboraufbau für eine Schule dienen. In die Schaltung sind 2 CPLDs, ein EPROM, ein RAM und ein µC integriert, wobei man auch alles in einem einzigen µC oder Signalprozessor unterbringen könnte. Allerdings geht's bei dem ganzen um den Lerneffekt.

    So, und das Programm funzt noch immer nicht, auch nicht auf einem installierten Debian-System. Findet wirklich keiner einen Fehler? :/

  13. #13
    pyrorl
    Gast
    Wahrscheinlich ist dein d[] noch zu klein, mach mal d[8] daraus.

  14. #14
    Registrierter Benutzer
    Registriert seit
    20.10.2005
    Beiträge
    12
    Funzt leider auch mt d[8] nicht der "neue" Error lautet:

    Code:
    *** glibc detected *** double free or corruption (top): 0x0804a008 ***
    Abgebrochen



    Achja, der erste Error (Speicherzugriffsfehler oder so) trat bei Knoppix auf, der oben genannte ist mit dem absolut gleichen Programm unter Debian (gcc4.0.2-2).

  15. #15
    Registrierter Benutzer
    Registriert seit
    22.03.2001
    Beiträge
    650
    Du solltest einen Debugger nehmen.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •