Avatar billede _just4fun_ Nybegynder
20. november 2002 - 09:16 Der er 4 kommentarer og
1 løsning

Hvordan hiver man et antal bits ud af en stream?

Hej

Når man bruger en BinaryReader kan man læse bytes fra en Stream ved metoden: ReadByte()...
Men hvis man skal læse et eller andet antal bits (f.eks. 2 bits) fra denne stream går jeg ud fra at man skal starte med at læse en byte, og efterføgende shifte lidt frem og tilbage. Er der nogen der ligger inde med en code snippet eller nogle patterns til hvordan det foregår?
Avatar billede z42cool Nybegynder
20. november 2002 - 10:20 #1
Du kan altid afmaske en bye ved hjælp af binær aritmetik, f.eks:

Byte b = 37;

bool bit0 = (b & 1) == 1;
bool bit1 = (b & 2) == 2;
bool bit2 = (b & 4) == 4;
..
..
bool bit7 = (b & 128) == 128;
Avatar billede z42cool Nybegynder
20. november 2002 - 10:22 #2
I ovenstående tilfælde er

37 decimal lig følgende i binær

7 6 5 4 3 2 1 0
0 0 1 0 0 1 0 1

bit0, bit 2 og bit5 er altså true fordi 1 + 4 + 32 = 37
Avatar billede _just4fun_ Nybegynder
20. november 2002 - 11:08 #3
ja, men når jeg efterfølgende skal læse en byte, så skal jeg ind og maske igen, fordi ReadByte() (eller Peak) æder en hel byte af den oprindelige stream.... Så det jeg efterspurgte var et pattern til hvordan det kunnne gøres eller en funktion/kodeeksempel der gjorde hentningen af de enkelte bits transperant.
Avatar billede z42cool Nybegynder
20. november 2002 - 11:28 #4
public class BitReader
{
  private BinaryReader innerReader;
  private byte buffer;

  public BitReader(BinaryReader reader)
  {
    this.innerReader = reader;
  }

  public void Advance()
  {
    this.buffer = this.innerReader.ReadByte();
  }

  public bool IsBitSet(byte bitPosition)
  {
    int bitValue = Math.Pow(2, bitPosition);
    return (this.buffer & bitValue) == bitValue;
  }
}

//Eksempel

BinaryReader binReader = new BinaryReader(new FileStream("test.bin", FileMode.Open));
BitReader bitReader = new bitReader(binReader);

//Read the first byte
bitReader.Advance();
//Check for bit 1
if (bitReader.IsBitSet(1))
  MessageBox.Show("Bit 1 er sat!");
Avatar billede _just4fun_ Nybegynder
24. november 2002 - 17:41 #5
... Ja. Løsningen blev at overloade streamen og implementere en ReadBit(n) der læste et antal bits... Tak for inputs
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester