I've got the following "printHex" string as a response from a 9P server running on the Inferno Operating System. (thanks to a friendly mailing list contributor who sent a nice example of using Data.Binary)<div>
<br></div><div>1300000065ffff000400000600395032303030</div><div><br></div><div>This is a little endian encoded ByteString with the following fields in it:</div><div><br></div><div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> Rversion {size :: Word32,</font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> mtype :: Word8,</font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> tag :: Word16, </font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> msize :: Word32, </font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> ssize :: Word16,</font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> version :: ByteString}</font></div><div><font class="Apple-style-span" face="'comic sans ms'"><br></font></div><div>But when I try to use the following implementation of "get" to decode this stream, I'm getting the following error:</div>
<div><br></div><div>"too few bytes. Failed reading at byte position 20"</div><div><br></div><div>Unfortunately, I'm only expecting 19 bytes, and in fact never asked for byte 20. (I am just asking for everything up to ssize, and then "getRemainingLazyByteString").</div>
<div><br></div><div>Is this a bug? Is it mine or in Data.Binary? :-)</div><div><br></div><div>Here's my "get" function:</div><div><br></div><div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> get = do s <- getWord32le</font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> mtype <- getWord8</font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> getSpecific s mtype</font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> where </font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> getSpecific s mt </font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> | mt == mtRversion = do t <- getWord16le</font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> ms <- getWord32le</font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> ss <- getWord16le</font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> v <- getRemainingLazyByteString</font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> return $ MessageClient $ Rversion {size=s,</font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> mtype=mt,</font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> tag=t,</font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> msize=ms,</font></div>
<div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> ssize=ss,</font></div><div><font class="Apple-style-span" face="'comic sans ms', sans-serif"> version=v}</font></div>
</div></div><div><br></div><div><div><br></div><div><br></div><div>The good news is I'm talking 9P otherwise, correctly, just having some decoding issues. I hope to have a hackage package eventually for this. </div>
<div><br></div><div>Dave</div></div>