Binärwert in einem Programm umrechnen?



  • hi
    ich muss in zuge meiner schulausbildung ein kleines projekt machen und habe da ein problem.
    und zwar brauch ich ein kleines C programm dass mir einen binären Wert in einen Dezimalwert umrechnet. (ich benötige den quellcode da ich diese funktion in mein ebstehendes programm einbinden müsste)
    also ich bekomm von meiner harware/schaltung über eine schnittstelle einen binären Wert geliefert. wie viele stellen dieser hat ist bis jetzt noch nicht genau festegelegt. denke so an die 8
    und jetzt muss mein programm diesen wert in dezimal umrechnen.
    da ich im softwarebereich nciht so bewandert bin bereitet mir das doch probleme.
    ich hoffe ihr könnt mir da weiterhelfen



  • #include <stdio.h>
    #include <math.h>
    
    int main(int args, char *argv[])
    {
    	int bin = 0x81; // dez 129
    	int i=0, dez=0;
    
    	while (bin)
    	{
    		dez += (bin & 1) * (int)pow(2,i++);
    		bin >>= 1;
    	}
    
    	printf("%d\n", dez);
    
    return 0;
    }
    

    Hab ich schnell zusammengeschustert und geht deshalb sicher noch effizienter!



  • LOL, sicher geht's effizienter.

    dez = bin;
    

    @beuschl
    Wie liegt denn der Ausgangswert vor, sprich, welcher Typ? Und wie soll der Zielwert aussehen?



  • omg, was mach ich da eigentlich 🙄



  • also der eingangswert wird mittels einer funktion geliefert. diese liest die einzelnen pins der schnittstelle aus (ob 0 oder 1) und speichert diese in einer variable zb pin
    und ich soll jetzt aus diesem bitmuster in der variable den dezimalwert generieren. das ist mein problem



  • Welchen Datentyp hat die Variable pin?



  • also im beispielprogramm zu der schnittstelle wurde der datentyp ULONG verwendet. hab zwar jetzt ka was das ist aber vielleicht könnt ihr damit etwas anfangen?



  • Ist dann wohl ein unsigned long mit 32 bits.
    Falls hier wirklich der binäre Wert gespeichert ist, kannst
    du ihn mit

    printf("%d",pin);
    

    dezimal ausgeben lassen.

    Ansonsten zeig doch mal das Beispielprogramm!



  • ULONG? Das klingt seltsam. Erstmal ist es kein Standard Datentyp, ist wohl ein typedef für unsigned long. Und zweitens wäre dies dann ein integraler Typ. Solche speichern keine binären oder dezimalen Werte, sondern nur Werte. Wie du diese letztendlich interpretierst, zB um sie anzuzeigen, ist deine Sache. Irgenwie kommen wir so nicht weiter. Poste am besten erstmal den Kopf der Funktion, die dir den Wert liefert, mit dem du letztendlich weiterarbeiten sollst.

    Eine andere Idee wäre noch, dass du die einzelnen Bits auf dezimale Stellen abbilden sollst. Also zB

    dein ULONG == 50 (dez) == 110010 (bin) -> 110010 (dez)
    

    Sollst du vielleicht sowas machen?



  • also meine schaltung ist mittels eines IO Warriors verbunden. Das ist eine Platine die mittels USB an dem PC verbunden ist und 40 I/O Pins hat. diese pins kann man lesen und schreiben. meine schaltung ist ein temperatursensor der an den einzelnen pins des IO Warriors eine 0 oder 1 liefert (also signal oder kein signal). mittels der unten angeführten Read funktion des IO Warriors muss ich jetzt die einzelnen pins abfragen und sehen ob dort eine 0 oder 1 anliegt. somit bekomm ich am ende also irgendeinen binären Wert heraus. das C programm soll diesen dann in dezimaler Schreibweise darstellen.

    Hier ein Auszug aus dem datasheet des IO Warriors (Read Funktion)

    Declaration:
    ULONG IOWKIT_API IowKitRead(IOWKIT_HANDLE devHandle, ULONG numPipe,
    PCHAR buffer, ULONG length);

    function IowKitRead(devHandle: IOWKIT_HANDLE; numPipe: ULONG;
    buffer: PChar; length: ULONG): ULONG; stdcall;

    Read data from IO-Warrior.
    This function reads length bytes from IO-Warrior and returns the number of bytes read if successful.
    Note that you must specify the number of the pipe (see IO-Warrior specs) to read from. numPipe ranges
    from 0 to IOWKIT_MAX_PIPES-1.
    Since the IO-Warriors are HID devices, you can only read the data in chunks called reports. Each report is
    preceded by a ReportID byte. The "IOWarriorDatasheet.pdf" elaborates about that.
    The function returns the number of bytes read, so you should always check if it reads the correct number
    of bytes, you can use GetLastError() to get error details. Keep in mind that data is always returned
    in report chunks, so reading 5 bytes from the IO-pins of an IO-Warrior 24 would only return 3 bytes of
    data because the IO-Warrior 24 has a 3 byte report whereas an IO-Warrior 40 has a 5 byte report.
    The Special Mode pipe has a report size of 8 bytes for all IO-Warriors.

    IOWKIT40_IO_REPORT report;
    ULONG res;
    // Read IO pins of IO-Warrior 40
    res = IowKitRead(ioHandle, IOW_PIPE_IO_PINS, &report, IOWKIT40_IO_REPORT_SIZE);
    if (res != IOWKIT40_IO_REPORT_SIZE)
    {
    // Didn't read, handle error
    ...
    }
    

    check bei der ganzen funktion eigentlich relativ wenig bzw die dokumentation ist für mich nur spanisch. das "ioHandle" in der funktion liefert mir vorher eine andere funktion. das ist kein prob. rest eher wenig bis ka



  • Das ULONG, was du zurückbekommst, enthält nicht die Daten. Dort steht die Länge des zurückgelieferten Reports drin. Ist letztendlich eher uninteressant und eigentlich nur für Fehleranalyse von Bedeutung. Die eigentlichen Werte werden im "buffer: PChar" Parameter gespeichert. Jedenfalls sollte dir die Dokumentation sagen, wie so ein Report aufgebaut ist.
    Wie du letztendlich die Werte dezimal anzeigen lassen kannst, ist recht simpel. curry-king hat das ja praktisch schon gezeigt.

    printf("%d\n", wert);
    

    Sofern wert einen integralen Typ hat, sollte dies kein Problem sein. Wenn du also 5 Bytes mit jeweils den Werten von 8 IO Signalen hast, dann gehst du in einer Schleife alle Bytes durch und gibst jedes wie oben gezeigt aus. Ein angezeigter dezimaler Wert repräsentiert dann praktisch 8 IO Signale.

    Und das mit dem "binären Wert" fehlinterpretierst du. Du hast keinen binären Wert, sondern einfach nur einen Wert. Dieser wurde zwar irgendwann mal aus binären Informationen erstellt, nämlich den IO Signalen. Danach ist das aber bedeutungslos. Deshalb brauchst du auch keinen "binären Wert" in einen dezimalen umwandeln.



  • ah da hab ich wohl was falsch verstanden
    d.h ich brauch diese READ funktion nur einmal aufrufen und damit werden alle Pins abgefragt oder?
    dachte nämlich anfangs man muss die funktion für jeden einzelnen pin ausführen


Anmelden zum Antworten