Laden...

Aus zwei Byte ein Word machen

Erstellt von Hurricane_One vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.179 Views
H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren
Aus zwei Byte ein Word machen

Hallo Gemeinde.

Neuer Tag, neue Frage zur schönsten Programmiersprache der Welt 😁

Folgendes Problem: Ich habe ein Array mit 11 Indexen ([0] - [10]) , in jedem Index steht 1 Byte. Ich möchte jetzt gerne aus zwei einzelnen Bytes ein Word machen.

Bsp.:
Data[8] = AA
Data[9] = BB

Data[...] = AABB

In C gab es dafür so etwas schönes wie Zeiger wenn ich mich recht entsinne 🤔
Gibt für dieses "banale" Problem eine Methode welche man anwenden kann, oder muss man einen Umweg gehen und eine Bitweise Operation durchführen?

LG

3.003 Beiträge seit 2006
vor 8 Jahren

MSDN: Bitconverter



var result = new List<UInt16>();
for(var i = 0; i<Data.Length; i +=2) //geht daneben für ungeradzahlig große Arrays
    result.Add(BitConverter.ToUInt16(Data,i));

result.ForEach(p => Console.WriteLine(p));

LaTino
Edit: bitte an die C#-Terminologie gewöhnen. Word (=> ushort, UInt16) und DWord (=> uint, UInt32) existieren nicht.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

Bitconverter, das ist ein gutes Schlagwort 😉 Danke.

Da habe ich auch direkt das von dir verwendete BitConverter.ToInt16 gefunden, ausprobiert und läuft^^

Bei deinem Bsp.-Code funktioniert die Ausgabe in der ForEach-Anweisung nicht.

3.003 Beiträge seit 2006
vor 8 Jahren

Bei deinem Bsp.-Code funktioniert die Ausgabe in der ForEach-Anweisung nicht.

Getippt im Editor, sonst wäre mir auch der Klammerfehler aufgefallen.

Korrigiert.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

Damit bin ich wieder etwas weiter gekommen, Danke 😉

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

Mir ist etwas aufgefallen beim testen der Funktionalität dieser Umrechnung.

Und zwar ist der Inhalt des jeweiligen Indexes richtig, aber das Ergebnis falsch. Der Grund liegt in einer veränderten Byte-Reihenfolge. Anstatt Big Endian, verwendet das Programm Little Endian.

Praktisches Bsp. aus meinen Testdaten:

Data[8] = 0E;
Data[9] =88;

0E88 = 3720

Vom Compiler ausgegebenes Ergebnis: 34830
(880E = 34830)

Wie lässt sich bei UInt16 dieses Problem lösen?

D
152 Beiträge seit 2013
vor 8 Jahren

Du musst die Byte-Reihenfolgen in Abhängigkeit von BitConverter.IsLittleEndian ggf. vorher drehen.
Du weißt ja in welcher Reihenfolge die Bytes vorliegen Big- oder Little Endian.

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

Du musst die Byte-Reihenfolgen in Abhängigkeit von
>

Danke 😉

3.003 Beiträge seit 2006
vor 8 Jahren

Anmerkungsweise: IsLittleEndian ist eine Eigenschaft der Prozessorarchitektur, auf der du dich bewegst. Für die meisten Fälle (x86) ist dieser Wert "true" (ist halt durch den Prozessor so vorgegeben). Bitconverter nutzt einfach die Vorgabe des Prozessors beim Konvertieren. Liegen die Daten also anders als auf der Architektur vorgegeben vor (in deinem Fall in BigEndian), musst man entweder

  1. die Daten umsortieren oder
  2. einen eigenen Bitconverter implementieren, dem man die Endianness mitgeben kann

.NET-Quellcode: was der Bitconverter macht

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

Danke für die Antwort.

Ich werde die Daten umsortieren.
Nur zum kurzen Verständnis, damit ändern sich alle Bits und nicht nur die Reihenfolge der Bytes?
Bsp.:

0110 1001 1010 0101 -> 1010 0101 1001 0110

3.003 Beiträge seit 2006
vor 8 Jahren

Praktisches Bsp. aus meinen Testdaten:

Data[8] = 0E;
Data[9] =88;

Vom Compiler ausgegebenes Ergebnis: 880E

Hast du dir selbst beantwortet: die Bytes.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)