Hallo liebes Forum, ich habe ein 16bit Array (das beliebig groß ist). Ich möchte die Elemente (also den Inhalt) des Arrays in 8bit Elemente zerlegen. Somit soll ein neues 8bit Array erstellt werden, welches doppelt so groß/lang ist, wie das bisherige 16bit Array. Grundsätzlich weiß ich, wie man ein 16bit in zwei 8bit Datentypen aufteilt. Aber wenn das für ein beliebig großes Array passieren soll, stehe ich leider an. Wenn möglich soll das mittels Pointer realisiert werden (also Funktionen, mit Adresse der Variablen übergeben werden). Vielen Dank für eure Hilfe!
Das hängt etwas davon ab, welche Reihenfolge du am Schluss haben willst. Idealerweise reicht schon ein einfacher cast.
1 | uint16_t array[10]; |
2 | uint8_t* ptr = (uint8_t*)array; |
Danach kannst du über ptr[x] auf 20 Bytes zugreifen.
Vielen Dank für die Antwort! Ich brauche dies, damit ich senden kann. Gibt es genauso einen Befehl um die zwei zugehörigen Bytes wieder richtig zu einem 16bit Wert zusammenzufügen? Sodass ich am Ende ein 16bit Array habe... Danke im Voraus
Solange die beiden Seiten Deiner Übertragung die gleiche Byte-Order haben, geht's natürlich auch anders herum.
1 | uint8_t array[20]; |
2 | uint16_t* ptr = (uint16_t*)array; |
Ansonsten müsstest Du jeden Eintrag im Array entsprechend umsetzen.
har schrieb: > Ich brauche dies, damit ich senden kann. Was ist das denn für eine blödsinnige Idee/Frage? Dazu muß man das Array doch nicht "zerlegen". Wenn du eine Funktion hast, mit der du ein Byte senden kannst, dann rufst du die einfach je einmal für das low- und das high-byte jedes Datenworts auf:
1 | #define ARRAY_LEN 42
|
2 | uint16_t array[ARRAY_LEN]; |
3 | |
4 | for (i=0; i<ARRAY_LEN; i++) |
5 | {
|
6 | uint8_t lb= array[i] & 0xFF; |
7 | uint8_t hb= array[i] >> 8; |
8 | sende_ein_byte(lb); |
9 | sende_ein_byte(hb); |
10 | }
|
> Gibt es genauso einen Befehl um die zwei zugehörigen Bytes wieder > richtig zu einem 16bit Wert zusammenzufügen? Schieben und mit dem ODER Operator (|) zusammenfügen. Lies am besten gleich den ganzen Artikel Bitmanipulation
Vorschlag:
1 | void send(void* data, int numberOfBytes) |
2 | {
|
3 | for (int i=0; i<numberOfBytes; i++) |
4 | {
|
5 | uint8_t dataByte=*data++; |
6 | send_one_byte(dataByte); |
7 | }
|
8 | }
|
Dieser Funktion kannst du nun beliebige Daten übergeben. Zahlen, Strings, Arrays jeglicher Bauart. Ist alles egal, Hauptsache es gibt einen Zeiger auf die Daten.
Geht das denn überhaupt? Wenn irgendeine Intelligenz beteiligt war, wurde das Array doch für 16-Bit Werte ausgelegt, weil diese auch vorkommen können. Man kann aber keinen 16-Bit Wert in 8-Bit packen. Geht es nur um das Versenden der Werte, so ist die ganze Arbeit sowieso für die Katz. Das geht auch ohne Umspeichern.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.