2013-04-23 15 views
5

Jaki jest najbardziej idiomatyczny sposób pisania kodu bit-twiddling w OCaml? Wiem o bardzo fajnej bibliotece Bitstring, ale to byłby świetny sposób na sparsowanie danych binarnych w jakimś protokole, nie obsługuje operacji bitowych takich jak xor czy shifting.Bitowe operacje w OCaml

Uważam, że podstawowa struktura danych używana przez tej biblioteki jest tylko ciągi SML, które znam są zmienne (i stosunkowo kompaktowy? Myślę, że czytałem, że istnieje niewiele napowietrznych gdzieś ...) tablice bajtów, ale nie można wygodnie wykonywać wielu bitowych operacji na łańcuchach jako tablic bajtowych, ponieważ xor, przesunięcia itd. nie są zdefiniowane na znakach, ale tylko na typach całkowitych , więc trzeba rzutować iz powrotem między ints a znaki ... na przykład, przesunięcie logiczne w lewo zdefiniowane na znaków (bajty):

let byte_lsl (x : char) (n : int) : char = 
    Char.chr (255 land (Char.code x lsl n)) 

# byte_lsl '\x0f' 1 ;; 
- : char = '\030' 

Czy to jest najlepsze, co możemy zrobić?

Prawdopodobnie jeśli kompilator nie zapisuje znaków w słowach maszynowych, nie jest to faktycznie nieefektywne i jest prawie takie samo jak sytuacja w Javie ... ale zarówno Haskell, jak i Standard ML zapewniają mniejsze liczby całkowite bez znaku, co daje wyniki w znacznie jaśniejszym kodzie, IMHO.

http://www.standardml.org/Basis/word.html#Word8:STR:SPEC

http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Word.html#t:Word8

Odpowiedz

8

Jeśli masz dużo kawałków, które chcesz efektywnie zapakować, można rozważyć użycie biblioteki Bigarray.

Uważam również, że byłoby dobrze używać ciągów. Dodatkowe funkcje nie generują żadnego kodu. Po prostu powodują ponowną interpretację danych za pomocą nowego typu. Jedynym problemem (który mogę wymyślić) z ciągami jest to, że istnieje dość mały limit rozmiaru ciągu w modelu 32-bitowym. Osiągnąłem ten limit kilka razy.

+0

Nie natknąłem się na tę bibliotekę w moich poszukiwaniach, przyjrzę się ... i dziękuję za potwierdzenie moich podejrzeń co do 'Code.chr' i' .code'! – spacemanaki