2 Bytes kombinieren
-
Hallo,
wie kann ich theoretisch 2 Bytes kombinieren also:
Byte 1: 12345678
Byte 2: ABCDEFGHByte 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: ABCDEFGHWas 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. 76543210Und 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 alsfscanf
.
Und es gibt nochfread
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 machlaenge = sizeof(inputpuffer) / sizeof(*inputpuffer);
Aber nicht innerhalb von Funktionen bei deren Parametern.