Strumień bitów

0

Potrzebuję czytać ze strumienia i pisać do niego pojedyncze bity, a nie całe bajty jak jest w T*Stream w Delphi. Ma ktoś rozwiązanie?

0

Czytać po bajcie, i rozkładać je na bity? wsadzić wyniki w tablice booleanów o ośmiu komórkach? i na nich coś robić?

0
=D napisał(a)

rozkładać je na bity?

Ale jak [???]

0

Bit najmłodszy (dajmy na to, że zerowy): (Bajt Shr 0) And 1;
Bit starszy od najmłodszego (w sensie pierwszy): (Bajt Shr 1) And 1;
drugi: (Bajt Shr 2) And 1;

I tak do siódmego (w ten sposób licząc).

Nie wiem dokładnie po co ci te pojedyncze bity, ale jak nie zależy Ci na upakowaniu informacji to możesz np. za bit zerowy uważać bajt równy 0, a wszystko inne za niezerowy. To najprostsza metoda, ale wtedy jeden bit zajmuje tyle co łosiem.

0
wincenty_kadlubek napisał(a)

Bit najmłodszy (dajmy na to, że zerowy): (Bajt Shr 0) And 1;
Bit starszy od najmłodszego (w sensie pierwszy): (Bajt Shr 1) And 1;
drugi: (Bajt Shr 2) And 1;

Dzięki :-)

wincenty_kadlubek napisał(a)

Nie wiem dokładnie po co ci te pojedyncze bity

Jak jest. np. struktura [ bajt ][ 5bitow ][ 2bajty ][ ... ] to standardowy TStream na nic mi. Może mógłbyś jeszcze pomóc w implementacji tego w strumieniu? Załóżmy, że chcę znać wartości kilku bitów (<= 7) i dalej czytać to co jest po tych bitach. TStream umie przesuwać się tylko z 8-krotną niedokładnością (czyli tylko po bajtach). Jak więc zacząć czytanie/pisanie od pozycji niepodzielnej przez 8?

0

Hmm... struktura powiadasz. Przykładowo:

{ Opcja pierwsza, która nie bardzo mi się podoba, ale dane są lepiej upakowane. }

 Var

  Struktura :
     Record
      Bajt    : Byte;
      _5Bitów : Byte;
      _2Bajty : Array [0..1] Of Byte;
     End;

    (* Tę funkcję można napisać na tysiąc sposobów, podaję ci
     * tylko jeden z nich, wcale nie najwydajniejszy. Lepszym
     * byłoby być może użycie masek. Z drugiej strony jeśli
     * prędkość działania nie jest tutaj krytyczna...
     * Czy takej funkcji nie ma w Delphi?
     *)
   Function Bit(B: Byte; N: Byte): Byte;
   Begin
    Bit:=(B Shr N) And 1;
   End;

 { ... }

Przechowywanie w jakiejś strukturze danych pojedynczych bitów jest mało możliwe. Dlatego wczytujesz do niej cały bajt pobrany ze strumienia. Następnie, by uzyskać wartości kolejnych bitów posługujesz się funkcją. Na to, że masz np. dwa bity puste w tym bajcie nic już nie poradzisz.

Opcja druga jest taka, że strukturę zamieniasz na:

{ ... }

 Var

  Struktura :
     Record
      Bajt    : Byte;
      _5Bitów : Array [0..4] Of Byte;
      _2Bajty : Array [0..1] Of Byte;
     End; 

Po prostu każdy bit przechowujesz w jednym bajcie. Wtedy tracisz jeszcze więcej pamięci, ale odczyt staje się o wiele prostszy.

Czytanie/pisanie od pozycji niepodzielnej przez osiem jest oczywiście możliwe, ale jak dla mnie mało celowe i niekonieczne. Przykładowo jeśli będziesz wypisywał po 2-5 bitów to zostaną one zapisane dopiero, gdy wypełnią cały bajt. W implementacji Ci nie pomogę, bo raczej nie uzywam delphi.

0
wincenty_kadlubek napisał(a)

Hmm... struktura powiadasz

Miałem namyśli plik o określonej strukturze, np. SWF lub każdy inny, w którym informacja jest zapisana nie w całym bajcie, lecz kilku bitach. Przykładowy wycinek formatu (nagłówek SWF):

Field Type Comment
Signature UI8 Signature byte
Signature UI8 Signature byte
Signature UI8 Signature byte
Version UI8 Single byte file version
FileLength UI32 Length of entire file in bytes
FrameSize RECT Frame size in twips
FrameRate UI16 Frame delay
FrameCount UI16 Total number of frames in file

oraz typ RECT:

Field Type Comment
Nbits UB[5] Bits in each rect value field
Xmin SB[Nbits] x minimum position for rect
Xmax SB[Nbits] x maximum position for rect
Ymin SB[Nbits] y minimum position for rect
Ymax SB[Nbits] y maximum p

TStrem umie odczytać pola, aż do FileLength, bo mają one od 1 do 4 bajtów. Następne w kolejce pole (struktura rekordowa) nie jest całym bajtem (jaki ma rozmiar definiuje pole RECT.Nbits, czyli 5 + 4Nbits - nigdy nie będzie to całkowita liczba bajtów). W TStream.Position określa bajty, TStream.Seek() - znow bajty. Dlatego pytam o metodą czytania struktu, gdzie podstawową jednostką są bity, a nie bajty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1