Ascii in Binär-Ascii



  • Hi, sry, das schon wieder sone Umwandlungsfrage kommt, aber im Internet und in Referenzen konnte ich nichts finden...
    Ich will ein Programm schreiben, welches einen eingegebenen Text in Binär-Acii Umwandelt.
    Zum Beispiel aus einem a, 1100001 macht...
    Da es sich um einen Text und nicht nur um einen Buchstaben handelt, hab ich das genze mit Arrays gelöst. Der String wird eingelesen, dann wird das Array in einer fot schleife durchlaufen und jeder Buchstabe umgewandelt und in ein int Array eingefügt (an der entsprechenden Stelle). Das ganz wird dann ausgegeben.
    Das Programm ist ein WinApi Anwendung, da es aber um die Umrechnung geht denke ich ist dieser Topic in Ansi C besser aufgehoben, wenn nicht bitte verschieben...
    Im Moment sieht es so aus:

    iLength = GetWindowTextLength(hWndEingabe);Wort = malloc(iLength);
    GetWindowText(hWndEingabe, Wort, iLength+1); //Hier wird das Wort eingelesen
    
    					switch(Wort[0]) //switch von Wort[0]
    					{
    					case 'a': NeuWort[0] = 1100001; /* Hier wird NeuWort der Binär-Code von a zugewiesen*/
    					break;
    					}
                           		sprintf(EndWort[0], "%i", NeuWort[0]); /*NeuWort wird an Endwort übergeben (weil das static nur mit char-Strings umgehen kann...)*/
                           		SetDlgItemText(hWnd, 7, EndWort); /*EndWort wird ausgegeben*/
    

    Die Variablen sind:
    char *Wort
    int NeuWort[100]
    char EndWort

    später soll das in einer schleife laufen, wobei dann 0 durch i ersetzt wird, soweit bin ich aber noch nicht.
    Ich hab es schonmal hingekriegt,das a richtig umgewandelt wurde, aber das auch nur einmal, jetzt kommt immer ein Speicher Fehler. Oder wenn ich [0] weglasse bei der Ausgabe 0 oder irgendwas anderes raus...

    Hoffe mir kann jemand helfen, danke im vorraus ^^

    MfG,
    MCP 🙂

    P.S.: warum wird mein v.o.r.r.a.u.s. immer ge*?





  • Hm, den Thread hab ich schon gesehen, das hilft mir auch nicht weiter... Will ja keine Zahlen Umwandeln, sonder Buchstaben. Gut, Buchstaben sind im Prinzip auch Zahlen, aber das hier is etwas anderes, ich denke das Problem liegt irgendwo in meinen Arrays.
    Ich weiss das es bei Pearl/php befehle zum Umwandeln gibt, aber bei C sind diese mir nicht geläufig und ich hab die nirgends gefunden...

    MfG,
    MCP

    P.S.: Danke trozdem für die schnelle Antwort ^^



  • du musst einfach jeden buchstaben einzeln üebrgeben...
    das ist alles



  • Schon klar, das mach ich ja auch, mit Wort[0], wird nur der erste Buchstabe vom Wort geprüft und umgerechnet, das funktioniert scheinbar auch. Nur bei irgendeinem der Übergaben von einem Array in das nächste, ist scheinbar ein Fehler den ich nicht finde (liegt wohl an mangelnder Erfahrung ^^ ).
    Folgendes sollte das Programm machen:
    Ein Wort einlesen, den ersten Buchstaben nehmen, gucken ob es ein a ist, wenn dies der Fall ist in das Array NeuWort, den Binär-Wert "1100001" eintragen, und dann diesen Wert an EndWort übergeben. Dieser wird dann ausgegeben.

    Ich denke das der Fehler bei der Zeile:

    sprintf(EndWort[0], "%i", NeuWort[0]);
    

    liegen muss. Aber was genau weiss ich nicht, ich wär davon ausgegangen, das der Wert 1100001 einfach zu lang für das erste Feld von EndWort ist, aber wenn ich nur ein Zeichen nehme, kommt der selbe Fehler...

    MfG,
    MCP



  • lol
    wie wärs mit ner zuweisung

    if(tolower(Wort[0])) =='a')NeuWort[0]=Wort[0]  ;
    

    so ganz blick ich noch nicht was du da am ende überhaupt rausbekomen willst?



  • Am ende will ich Den Text in Binär Ascii haben, sprich, den text als 1en und 0en. wie auf diesen T-Shirt:
    http://www.thinkgeek.com/tshirts/generic/2826/
    (nicht persönlich nehmen, aber das was auf dem T-shirt steht, Binär-Ascii will ich raushaben... das is halt nur nen gutes Beispiel...nicht das du denkst ich will sagen du wärst dumm, gibt leute die könnten das falsch verstehen, das will ich auf keinen Fall sagen!!!).
    Bei deinem Code wär NeuWort dann ja auch a, das geht sowieso nicht, da NeuWort ein integer String ist. da kann ich keine Buchstaben reinschreiben. da kommen die 1en und 0en rein, die dann wieder in den EndWort string müssen. der ist ein char String.
    Hoffe ich hab das gescheit erklärt... ^^ 😃

    MfG,
    MCP



  • Bei deinem Code wär NeuWort dann ja auch a, das geht sowieso nicht, da NeuWort ein integer String ist. da kann ich keine Buchstaben reinschreiben

    klar geht das... ich glaub du hast da was grundlegendes nicht verstanden.. die repräsentation im speicher sind von vorherein nur 0 und 1...
    der kleinste datentyp in c hat aber immer ein byte...

    void binaer_ausgeben(unsigned char buchstabe){ 
    for(int i=8;i;--i)printf("%d",(buchstabe>>(i-1))&1); 
    } 
    
    int main(){
    char text[]="Hello World";
    
    for(int i=0;i<sizeof(text);++i)
    	binaer_ausgeben(text[i]);
    
    }
    

    wenn du das in ein array mit nullen und einsen ballern willst geht das auch problemlos musst du nur oben anstatt 0 und 1 mit printf auszugeben einfach zuweisen...

    allerdings würd ich dafür kein int-array nehmen weil sizeof(int) auf den meisten plattformen 4 byte verballert... kannst einfach eine char-array nehmen das 8 mal so gross ist wie dein string, da passen dann alle 0 und 1 rein so wie ichs dir hier gepostet habe



  • der kleinste datentyp in c hat aber immer ein byte...

    er hat mindestens 8 Bit... (nach C99) dh. er könnte auch größer sein, aber sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) muss erfüllt bleiben.

    bye

    tt



  • @TheTester
    mir war so als würde gelten

    1=sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
    ist aus dem = wirklich ein kleiner gleich geworden?



  • Verstanden hab ich das schon!
    Hm, dein Code funktioniert (auch wenn er nicht c99 konform is, laut compiler, aber wenn man die Variablen vor der for schleich deklariert mackert er nicht mehr ^^ )
    So, dann werd ich mal versuchen das zu verstehen...
    Soweit ist alles klar bis auf: printf("%d",(buchstabe>>(i-1))&1).
    So ganz raff ich das noch nicht. Wird da jetzt automatisch, zum Umwandeln der dezimal Wert des Buchstaben genommen? also: H (was beim ersten Aufruf von Ausgabe_Binär übergeben wird) wär da ja: 72, was Binär 1001000 wär (und das gibt er auch aus, komischerweise mit eine 0 davor...). Aber sonst versteh ich den Teil von dem Code noch nicht, kannst du mir das erklären?
    Muss das verstehen um es in mein Programm übernehmen zu können...

    MfG,
    MCP



  • guck in den anderen thread da wo ich dir den link gepostet hatte...
    da hat sidewinder das megaausführlich erklärt...



  • Ok, also, ich glaub ich habs vom Prinzip verstanden. Hab zwar noch nicht gerafft was ">>" ist (nen Operator? oder 2x kleiner? to binary?) Aber das system nach dem es abläuft, danke für die Hilfe, jetzt müsste ich es auch in den Code implementieren können.

    Danke für die Hilfe!

    MfG,
    MCP



  • Das sollte eigentlich in jedem Tut oder Buch drinstehen, was >> und << zu bedeuten haben.
    Das sind die Bitshifting-Operatoren. Damit wird ein bestehendes Bitmuster in die jeweilige Richtung um soundsoviele Stellen verschoben, also etwa so:

    char a = 10; //1 Byte, damits nicht zu aufwändig wird, Wert binär: 00001010
    char b, c;
    b = a >> 1;      //Wert von b binär: 00000101
    c = a << 2;      //Wert von c binär: 00101000
    

    Schau dir mal ein paar Tuts an, da stehts noch genauer erklärt.
    [edit]Oh Gott, was für eine Rechtschreibung[/edit]



  • Verwirrt bin... Das steht in keinem meiner Bücher und in der Schule hat un das auch keiner beigebracht...
    Aber gut, werd ich mal nach suchen, danke für den Tipp...
    Wie merkwürdig das is, das ich sowas wichtiges einfach übersehen hab... Was mich aber noch mehr wundert, das wir das in der Schule (Fachhochschule Informationstechnik) nicht mal im Ansatz durchgenommen haben...
    Aber jetzt raff ich das mit dem Code auch! Danke!

    MfG,
    MCP

    P.S.: Das macht mich echt fertig das das so an mir vorbeigezogen is...



  • da mit dem >> hät ich dir auch sagen können 😃



  • Da deine Anwendung eine WinApi-Geschichte ist, will ich hoffen, daß dein Text nicht als Unicode vorliegt, da sonst ein 1 Byte nicht ausreicht. Ferner benutzt die WinApi nicht ASCII sondern ANSI, d.h. die zeichen > 127 differieren.



  • const int binaerwerte[] ={1,2,4,8,16,32,64,128};
    
    string DtoB (int Number)
    {
      int Code=Number;
      string Ergebnis="";
      for (int i=7;i>-1;i--)
      {
         if (Code-binaerwerte[i]<0) Ergebnis="0"+Ergebnis;
         if (Code-binaerwerte[i]>=0)
         {
          Ergebnis="1"+Ergebnis;
          Code=Code-binaerwerte[i];
         }
       }
      return Ergebnis;
    }
    //---------------------------------------------------------------------------
    

    So, mit dieser Funktion hab ich meinerzeit (lang, lang ist's her 😉 )
    Integer in ASCII-Binärzahlen umgewandelt - wobei diese natürlich nicht binär sondern in einem String gespeichert werden.

    Um die Buchstaben in Integer umzuwandeln machst du einfach einen String:
    string letter = " !'#% ...";
    In den Schreibst du einfach alle ASCII-Zeichen von 31-255 hintereinander rein.
    Dann suchst du bei jedem neuen Zeichen in dem letter-String danach und rechnest Trefferposition+30 = IntegerWert des ASCII-Zeichens.

    Also, mit sicherheit geht das auch einfacher, aber ich finde es so am anschaulichsten.

    mfg,
    chris90 🙂



  • chris90 schrieb:

    Um die Buchstaben in Integer umzuwandeln machst du einfach einen String:
    string letter = " !'#% ...";
    In den Schreibst du einfach alle ASCII-Zeichen von 31-255 hintereinander rein.
    Dann suchst du bei jedem neuen Zeichen in dem letter-String danach und rechnest Trefferposition+30 = IntegerWert des ASCII-Zeichens.

    Also, mit sicherheit geht das auch einfacher, aber ich finde es so am anschaulichsten.

    chris90 🙂

    Also das ist der absolute Qutasch, da ja im dem char schon der Asciiwert drinsteht, und nur durch interpretation durch den Computer in ein Zeichen
    umgewandelt wird.

    probier doch mal ein einfaches

    printf("%d",'a');
    

    grüße, Con@n


Anmelden zum Antworten