Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Bitweises lesen von Daten

Empfohlene Antworten

Veröffentlicht

Hat jemand eine Idee, wie ich die einzelnen Bits aus einem Datenwort auslesen kann? Oder gibt es noch einen kleinere Datentyp als short?

Bisher lese ich meine Daten folgendermaßen in eine Struktur ein:



ifl.seekg(z*sizeof(short), ios::beg); // Sprung zur gewünschten Stelle

ifl.read((char*)&Tab[i].wertb32, sizeof(short)); // Einlesen des Wertes in die Struktur

z++;


Das ganze läuft als Schleife ab, da ich den Ablauf der Werte im File kenne. Jetzt will ich aber nicht die komplette Zahl auslesen, sondern jedes Bit einzeln, um mir eine switch-case Schleife zu ersparen, in der ich die Dezimalwerte in die Binärkombination umwandel.

So habe mich schon mal ein wenig schlau gemacht, und folgenden Ansatz gefunden. Leider jedoch noch nit mit dem gewünschten Ergebnis:



ifl.seekg(z*sizeof(short), ios::beg);

ifl.read((char*)&Tab[i].message, sizeof(short));

(Tab[i].message & 0x00)&Tab[i].bit0;

(Tab[i].message & 0x10)&Tab[i].bit1;

(Tab[i].message & 0x20)&Tab[i].bit2;

(Tab[i].message & 0x30)&Tab[i].bit3;

(Tab[i].message & 0x40)&Tab[i].bit4;

(Tab[i].message & 0x50)&Tab[i].bit5;

(Tab[i].message & 0x60)&Tab[i].bit6;

(Tab[i].message & 0x70)&Tab[i].bit7;

(Tab[i].message & 0x80)&Tab[i].bit8;

(Tab[i].message & 0x90)&Tab[i].bit9;

(Tab[i].message & 0xA0)&Tab[i].bit10;

(Tab[i].message & 0xB0)&Tab[i].bit11;

(Tab[i].message & 0xC0)&Tab[i].bit12;

(Tab[i].message & 0xD0)&Tab[i].bit13;

(Tab[i].message & 0xE0)&Tab[i].bit14;

(Tab[i].message & 0xF0)&Tab[i].bit15;

z++;


Als ergebnis möchte ich nur die Nullen und Einsen angezeigt bekommen, aus denen mein short message zusammengesetzt ist.

Also zum Beispiel:

Message = 55

Bit0 = 1

Bit1 = 1

Bit2 = 1

Bit3 = 0

Bit4 = 1

Bit5 = 1

Bit6 = 0

usw. bis bit15. Sieht jemand den Fehler?

So, ich hab das Problem gelöst, allerdings auf eine sehr unkonventionelle und umständliche Weise. Vielleicht hat ja noch jemand einen Tipp, wie es eleganter geht. Ich rechne jetzt jede Potenz von hand aus, also:


if (Tab[i].message - 32768 >= 0)

{

Tab[i].bit15 = 1;

Tab[i].message = Tab[i].message - 32768;

}

else

{

Tab[i].bit15 = 0;

}

if (Tab[i].message - 16384 >= 0)

{

Tab[i].bit14 = 1;

Tab[i].message = Tab[i].message - 16384;

}

else

{

Tab[i].bit14 = 0;

}

usw. bis bit0

Wie gesagt, nicht sehr elegant, aber erfolgreich. Ich hatte zwischenzeitlich folgenden Ansatz verfolgt, der aber leider nicht das korrekte Ergebnis brachte, aber vielleicht sieht jemand von Euch den Fehler:

Tab[i].bit0 = (Tab[i].message & 0x0100) !=0;

Tab[i].bit1 = (Tab[i].message & 0x0200) !=0;

Tab[i].bit2 = (Tab[i].message & 0x0400) !=0;

Tab[i].bit3 = (Tab[i].message & 0x0800) !=0;

Tab[i].bit4 = (Tab[i].message & 0x1000) !=0;

Tab[i].bit5 = (Tab[i].message & 0x2000) !=0;

Tab[i].bit6 = (Tab[i].message & 0x4000) !=0;

Tab[i].bit7 = (Tab[i].message & 0x8000) !=0;

Tab[i].bit8 = (Tab[i].message & 0x0001) !=0;

Tab[i].bit9 = (Tab[i].message & 0x0002) !=0;

Tab[i].bit10 = (Tab[i].message & 0x0004) !=0;

Tab[i].bit11 = (Tab[i].message & 0x0008) !=0;

Tab[i].bit12 = (Tab[i].message & 0x0010) !=0;

Tab[i].bit13 = (Tab[i].message & 0x0020) !=0;

Tab[i].bit14 = (Tab[i].message & 0x0040) !=0;

Tab[i].bit15 = (Tab[i].message & 0x0080) !=0;

Danke und Frohe Pfingsten schon mal.

Es gäbe noch char (8 Bit)


ifl.seekg(z*sizeof(short), ios::beg);
ifl.read((char*)&Tab[i].message, sizeof(short));
(Tab[i].message & 0x0001)&Tab[i].bit0;
(Tab[i].message & 0x0002)&Tab[i].bit1;
(Tab[i].message & 0x0004)&Tab[i].bit2;
(Tab[i].message & 0x0008)&Tab[i].bit3;
(Tab[i].message & 0x0010)&Tab[i].bit4;
(Tab[i].message & 0x0020)&Tab[i].bit5;
(Tab[i].message & 0x0040)&Tab[i].bit6;
(Tab[i].message & 0x0080)&Tab[i].bit7;
(Tab[i].message & 0x0100)&Tab[i].bit8;
(Tab[i].message & 0x0200)&Tab[i].bit9;
(Tab[i].message & 0x0400)&Tab[i].bit10;
(Tab[i].message & 0x0800)&Tab[i].bit11;
(Tab[i].message & 0x1000)&Tab[i].bit12;
(Tab[i].message & 0x2000)&Tab[i].bit13;
(Tab[i].message & 0x4000)&Tab[i].bit14;
(Tab[i].message & 0x8000)&Tab[i].bit15;
z++;
[/PHP]

Morgen,

falls es von Interesse ist, so ist man etwas flexibler:


template<size_t bitfieldSize>
struct bits {
size_t bit : bitfieldSize;
void write(ostream& out) const {
for(int i = bitfieldSize; i >= 0; --i)
if(bit & (1 << i))
out<<"1";
else
out<<"0";
}

bits& operator<<(const std::string& data) {
memcpy(this, data.c_str(), min(bitfieldSize, data.size()));
return *this;
}

bits& operator<<(const long& data) {
memcpy(this, &data, min(bitfieldSize, sizeof(data)));
return *this;
}

bits& operator<<(const double& data) {
memcpy(this, &data, min(bitfieldSize, sizeof(data)));
return *this;
}
};

template<size_t bitfieldSize>
ostream& operator<<(ostream& out, const bits<bitfieldSize>& {
b.write(out);
return out;
}
[/PHP]

Als kleines Beispielprogramm:

[PHP]
int main() {
const char* text = "test";
bits<32> bit;
bit << text;
cout<<bit<<endl;
size_t i = 4;
bit << static_cast<long>(i);
cout<<bit<<endl;
}

mfg

realisticer

Da faellt mir noch auf: sizeof(data) muss mit 8 multipliziert werden ;)

mfg

realisticer

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.