16bit Array in 8bit Array zerlegen

Gast #4877971
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!
Gast #4877978
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.
Gast #4878876
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
Gast #4878884
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.
#4879038
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
Gast #4879051
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.
Gast #4879056
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren