2 Bytes kombinieren



  • Hallo,
    wie kann ich theoretisch 2 Bytes kombinieren also:
    Byte 1: 12345678
    Byte 2: ABCDEFGH

    Byte 2 soll die letzen beiden Ziffern von Byte1 besitzen und die letzten 4 Behalten und mit zwei 0 dahinter also:

    0078ABCD

    index2 = (input[0] >> 6 + input[1] >> 4 ); // Index2 die letzen 2 Bit von 1. Byte und 4 Bit von 2. Byte
    index2 >> 2; //zwei nach rechts verschieben für die 2 0 am anfang
    

    input 0 ist 1. Byte und input 1 ist 2. Byte. So einfach ist es nicht möglich oder?

    Warum ich das brauche: zum codieren eines Textes.



  • ich geh mal davon aus das du hier strings hast.
    der operator>> dient hier als bitshift operator. damit verschiebst du die bits in einem z.b. int. du willst aber chars in einem string verschieben



  • Thisisit schrieb:

    Hallo,
    ...
    Byte 1: 12345678
    Byte 2: ABCDEFGH

    Was ist Deiner Meinung nach ein Byte? Wie groß ist es? Welche Werte (wieviel verschiedene) kann es annehmen?



  • Die Bytes sind als Beispiel gedacht. Es ist normalerweise in Binär form. Habe es so aufgeschrieben um es deutlich zu machen. Kann man Bytes einfach addieren?



  • Du müßtest die mit >> verschobenen Bits vor dem Addieren (bzw. besser ist der logische Oder Operator |) wieder mit dem Links-Shift Operator << wieder an die passende Position schieben, z.B.

    index2 = ((input[0] >> 6) << 4) | input[1] >> 4;
    

    Zusätzlich benötigst du aber evtl. noch Bitmasken, um (höherwertige) Bits zu löschen, z.B.

    byte2 = (byte1 >> 2) & 0x0F; // verschiebt die Bits um 2 nach rechts und behält nur die untersten 4 Bits (löscht also die ursprünglich oberen 2 Bits)
    

    PS: Deine Bit-Darstellung ist irritierend, denn üblicherweise ist 8 das höherwertige Bit (oder 7 wenn man bei 0 beginnt):
    Byte 1: 87654321 bzw. 76543210

    Und deine Erklärung

    Thisisit schrieb:

    Byte 2 soll die letzen beiden Ziffern von Byte1 besitzen und die letzten 4 Behalten und mit zwei 0 dahinter also:

    passt auch nicht zu deiner Lösungsdarstellung: 0078ABCD.



  • Thisisit schrieb:

    Kann man Bytes einfach addieren?

    Ja.
    Dazu ist der + Operator da.



  • Danke hat geholfen jetzt wird richtig codiert. Ich will jetzt Buchstaben von einer Datei auslesen, dann codieren mit encode() und in eine Datei schreiben. Leider funktioniert es nicht ganz.
    Meine Fragen:
    Kann ich Buchstabe für Buchstabe auslesen und jede Buchstabe in ein Array "packen" (unten versucht)
    Wie kann ich herausfinden wie viele Buchstaben in der Datei sind? Durch sizeof?

    }
    


  • Thisisit schrieb:

    Kann ich Buchstabe für Buchstabe auslesen und jede Buchstabe in ein Array "packen" (unten versucht)

    Aber nicht gemacht.
    Du liest das ZEichen in die VAriable c ein, und gibst ein Zeichen aus dem Array aus.
    Du testest nur auf EOF und nicht darauf, das auch i eingehalten wird.

    Schau dir mal die Funktion fread an.

    Thisisit schrieb:

    Wie kann ich herausfinden wie viele Buchstaben in der Datei sind?

    Dazu musst du einmal durch die Datei durch und mitzählen.

    Wenn du wissen möchtest, wieviel Byte in der Datei sind, kannst du sie im binary mode öffnen, an das Dateiende springen und die Position des Lesezeigers auslesen. Das geht mit `fseek, ftell

    `
    http://www.cplusplus.com/reference/cstdio/ftell/

    Mittlerweile gibts damit aber durchaus Problem mit 32-Bit Programmen auf 64-Bit Systemen, bzw Dateisystemen die große Dateien unterstützen.

    Thisisit schrieb:

    Durch sizeof?

    sizeof gibt die Größe eines Objektes wieder.

    Verzichte darauf, die ganze Datei in den Speicher zu laden. Dann bist du davon unabhängig.

    (Im übrigen machst du da C und kein C++)



  • Ich hab es mal so versucht, leider funktioniert es immernoch nicht. Ich komme nicht drauf woran es liegt. (Ist kein c++ sondern C falsche Sektion)
    Sizeof muss ich noch anders lösen, funktioniert aber mit konstanten Werten auch nicht.

    }
    


  • Thisisit schrieb:

    Ich hab es mal so versucht, leider funktioniert es immernoch nicht. Ich komme nicht drauf woran es liegt.

    Dann lese und verstehe die Fehlermeldungen und Warnungen.
    Behebe deen Ursache.

    Wenn du keine Warnungen erhälst, dann erhöhe den Warn Level vom Compiler.

    Du übergibst mehrmals an Funktionen Paramter vom falschen Typ.

    Zum Lesen einzelner Zeichen fgetc besser als fscanf .
    Und es gibt noch fread zum lesen von ganzen Blöcken.

    Nebenbei: sizeof(char) (auch sizeof(unsigned char)) ist per Definition 1.
    Wenn du da etwas universelles haben willst, dann mach

    laenge = sizeof(inputpuffer) / sizeof(*inputpuffer);
    

    Aber nicht innerhalb von Funktionen bei deren Parametern.


Log in to reply