16bit Array in 8bit Array zerlegen

Gast #4877971
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
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
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
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
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.