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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von har (Gast)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
1 lesenswert
nicht 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.

: Bearbeitet durch User
von Amateur (Gast)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.