Forum: Mikrocontroller und Digitale Elektronik 16bit Array in 8bit Array zerlegen


von har (Gast)


Lesenswert?

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!

von nocheinGast (Gast)


Lesenswert?

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.

von har (Gast)


Lesenswert?

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

von rk (Gast)


Lesenswert?

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.

von Axel S. (a-za-z0-9)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.