<br>dude .. you rock ... let me check it out ;^)<br><br>Vasili<br><br><br><div class="gmail_quote">On Fri, Jan 2, 2009 at 12:24 AM, Antoine Latter <span dir="ltr"><<a href="mailto:aslatter@gmail.com">aslatter@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d">On Jan 1, 2009 11:50pm, "Galchin, Vasili" <<a href="mailto:vigalchin@gmail.com">vigalchin@gmail.com</a>> wrote:<br>
> it is a bioinformatics standard .. . I am writing on this newsgroup in order to try to be objective to get a "correct" and elegant answer .. in any case I am helping on the bioinformatics code (you can see on Hackage). I am trying to finish the 2Bit file format code ... it seems to me that bioinformatics as an area is not clearly defined .... e.g. it is unclear to me whether "offset" is a marshalled/serialized concept or or unmarshalled/unserialized concept ..... this distinction is very important .... I will have to think about more myself!<br>
><br>
><br>
> Regards, Vasili<br>
><br>
<br>
<br>
</div>Here's some code using Data.Binary to store data as offsets into a<br>
byte array. I haven't tested it too much, so it may have bugs. Maybe<br>
there's some inspiration in there.<br>
<br>
-Antoine<br>
<br>
>>>><br>
import Data.Binary<br>
import Data.Binary.Get<br>
import Data.Binary.Put<br>
<br>
import Data.ByteString.Lazy (ByteString)<br>
import qualified Data.ByteString.Lazy as B<br>
<br>
data TestStruct = TestStruct<br>
{ property1 :: ByteString<br>
, property2 :: ByteString<br>
, property3 :: ByteString<br>
}<br>
deriving Show<br>
<br>
{-<br>
<br>
The serialized format looks like (all big-endian):<br>
<br>
* first offset into data block (Word32)<br>
* second offset into data block (Word32)<br>
* third offset into data block (Word32)<br>
* length of bnary data block (Word32)<br>
* binary data block (Arbitrary binary data)<br>
<br>
-}<br>
instance Binary TestStruct where<br>
put struct =<br>
let data1 = property1 struct<br>
data2 = property2 struct<br>
data3 = property3 struct<br>
<br>
dataBlock = data1 `B.append` data2 `B.append` data3<br>
<br>
offset1 = 0<br>
offset2 = offset1 + B.length data1<br>
offset3 = offset2 + B.length data2<br>
<br>
in do<br>
putWord32be $ fromIntegral offset1<br>
putWord32be $ fromIntegral offset2<br>
putWord32be $ fromIntegral offset3<br>
<br>
putWord32be $ fromIntegral $ B.length dataBlock<br>
putLazyByteString dataBlock<br>
<br>
get = do<br>
offset1 <- getWord32be<br>
offset2 <- getWord32be<br>
offset3 <- getWord32be<br>
<br>
dataBlockLength <- getWord32be<br>
dataBlock <- B.drop (fromIntegral offset1) `fmap`<br>
getLazyByteString (fromIntegral dataBlockLength)<br>
<br>
let (data1, rest1) =<br>
B.splitAt (fromIntegral $ offset2 - offset1) dataBlock<br>
(data2, rest2) =<br>
B.splitAt (fromIntegral $ offset3 - offset2 - offset1) rest1<br>
data3 = rest2<br>
<br>
return $ TestStruct data1 data2 data3<br>
<<<<<<br>
</blockquote></div><br>