Powiedzmy mam następujące rodzaje:Jak bezboleśnie serializować Little-endian PODs?
data WaveFormatChunk = WaveFormatChunk {
compression :: Word16,
channels :: Word16,
sampleRate :: Word32,
averageBps :: Word32,
blockAlign :: Word16,
significantBits :: Word16
} deriving (Show)
Czy istnieje sposób, aby po prostu zrzucić to wszystko na ByteString (lub podobna konstrukcja) hurtowo (w sposób elemencie Ye Olde C)? Jeśli nie i muszę napisać funkcję, która osobno umieszcza je wszystkie na liście, czy istnieją co najmniej funkcje, które ułatwiają przyklejenie wartości do, na przykład, listy Word8? Coś w stylu putWordBBxe, z wyjątkiem ciągów bajtów lub list (chociaż najprawdopodobniej bardzo się mylę, ponieważ nie czytałem jeszcze w Monadach, wydaje mi się, że Get/Put są najczęściej używane ze strumieniami).
Data.Binary nie jest tym, czego szukam, wydaje się bardziej przydatny do zrzucania danych na dysk niż do przechowywania go w określonym formacie z konkretną (i "złą") endianowością.
Pisanie instancji ['Storable'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Foreign-haskell.org/packages/archive/base/latest/doc/html/Foreign-Storable.html) dla' WaveFormatChunk' jest całkiem proste. To pozwoli ci pisać ('poke') i czytać (' peek') 'WaveFormatChunk's do iz lokalizacji w pamięci (tak jakby były to stare C-y). Można je następnie przekształcić w 'ByteString's, jeśli sobie tego życzysz. Nie wiem, czy to jest dokładnie to, czego szukasz, ale mogę je rozwinąć, jeśli chcesz. Istnieje również [pakiet binarny] (http://hackage.haskell.org/package/binary) do serializacji. – gspr
... oh, widzę, że moja edycja o pakiecie binarnym była całkiem bezwartościowa, ponieważ już o tym wiesz :-) – gspr
Schludny to zdecydowanie droga. Nie zbliżysz się do C, zarówno pod względem stylu realizacji, jak i wydajności. [Oto przykład] (http://hpaste.org/76299). –