Próbuję wykonać parsowanie pliku binarnego w szybkim tempie, i chociaż mam działające rzeczy, mam sytuację, w której mam zmienne pola.Podejście do odczytywania dowolnej liczby bitów w szybkim tempie
mam wszystkie moje analizowania pracy w przypadku domyślnym
łapię
1-bit field
1-bit field
1-bit field
11-bits field
1-bit field
(optional) 4-bit field
(optional) 4-bit field
1-bit field
2-bit field
(optional) 4-bit field
5-bit field
6-bit field
(optional) 6-bit field
(optional) 24-bit field
(junk data - up until byte buffer 0 - 7 bits as needed)
Większość danych używa tylko pewien zbiór optionals więc Poszedłem do przodu i zaczął pisać klasy do obsługi te dane. Moje ogólne podejście jest stworzenie struktury wskaźnika, a następnie skonstruować tablicę bajtów, które:
let rawData: NSMutableData = NSMutableData(data: input_nsdata)
var ptr: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8(rawData.mutableBytes)
bytes = UnsafeMutableBufferPointer<UInt8>(start: ptr, count: rawData.length - offset)
więc skończyć pracę z tablicą [UInt8]
i mogę wykonywać moją analizowania w sposób podobny do:
let b1 = (bytes[3] & 0x01) << 5
let b2 = (bytes[4] & 0xF8) >> 3
return Int(b1 | b2)
A więc, gdy napotkam problem, to z opcjonalnymi polami, ponieważ moje dane nie leżą szczególnie na granicach bajtów, wszystko staje się skomplikowane. W idealnym świecie prawdopodobnie po prostu pracowałbym bezpośrednio ze wskaźnikiem i przesuwałbym go o bajty w razie potrzeby, jednak nie ma sposobu, aby zdać sobie sprawę z przesunięcia wskaźnika o 3 bity - co sprowadza mnie do mojego pytania
Jakie jest najlepsze podejście do radzenia sobie z moją sytuacją?
Jedną z idei, o której pomyślałem, było wymyślenie różnych struktur, które odzwierciedlają opcjonalne pola, z tym, że nie jestem pewien, jak szybko utworzyć spasowane struktury bitowe.
Jakie jest moje najlepsze podejście tutaj? W celu wyjaśnienia - początkowe pola 1-bit
określają, które z opcjonalnych pól są ustawione.
Chyba że zostały specjalnie chcą zaprojektować własną implementację, chciałbym po prostu użyć [CFBitVector] (https://developer.apple. com/library/mac/documentation/CoreFoundation/Reference/CFBitVectorRef /). –
@SamR .: CFBitVector jest wygodny w zarządzaniu dużym zbiorem bitów, ale - o ile nie zauważam czegoś - nie pomaga odzyskać liczby przechowywanej w wielu bitach, być może w granicach bajtów. Pobieranie wszystkich bitów dla jednego pola oddzielnie i budowanie z nich liczby prawdopodobnie nie jest zbyt skuteczne. –