2013-04-23 15 views
5

Qual è il modo più idiomatico per scrivere codice bit-twiddling in OCaml? Conosco la fantastica libreria Bitstring, ma mentre questo sarebbe un ottimo modo per analizzare i dati binari in alcuni protocolli, non supporta operazioni bit a bit come xor o shifting.Operazioni bit a bit in OCaml

credo che la struttura dei dati di base utilizzato da tale libreria è solo stringhe OCaml, che so sono mutabili (e relativamente compatta ? Penso che ho letto che c'è poco overhead da qualche parte ...) array di byte, ma non è possibile eseguire molte operazioni bit a bit su stringhe come array di byte poiché xor, shift e così via non sono definiti sui caratteri, ma solo sui tipi interi , quindi è necessario eseguire il cast avanti e indietro tra inte e caratteri ... ad esempio, spostamento logico a sinistra definito su caratteri (byte):

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

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

E 'questo il meglio che possiamo fare?

Presumibilmente, se il compilatore non è imballaggio caratteri in parole macchina già, questo non è in realtà inefficiente ed è più o meno come la situazione in Java ... ma Haskell e ML standard entrambi forniscono più piccoli tipi interi senza segno che si traduce in un codice molto più chiaro, 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

risposta

8

Se hai un sacco di pezzi che si desidera mettere in valigia in modo efficiente, si potrebbe considerare l'utilizzo della libreria Bigarray.

Penso anche che sarebbe meglio usare stringhe. Le funzioni extra Char.code e Char.chr non generano effettivamente alcun codice. Semplicemente causano la reinterpretazione dei dati con un nuovo tipo. L'unico problema (che posso pensare) con le stringhe è che c'è un limite piuttosto piccolo alle dimensioni delle stringhe nel modello a 32-bit. Ho raggiunto questo limite alcune volte.

+0

Non avevo inciampato in quella libreria nella mia ricerca, darò un'occhiata ... e grazie per aver confermato i miei sospetti su 'Code.chr' e' .code'! – spacemanaki

Problemi correlati