The thing is I have 19 bytes in the hex string I provided:<div><span style="border-collapse:collapse"><br></span></div><div><span style="border-collapse:collapse">1300000065ffff000400000600395032303030</span></div>
<div><span style="border-collapse:collapse"><br></span></div><div><span style="border-collapse:collapse">That's 38 characters or 19 bytes.</span></div><div><span style="border-collapse:collapse"><br>
</span></div><div><span style="border-collapse:collapse">The last 4 are 9P2000</span></div><div><span style="border-collapse:collapse"><br></span></div><div><span style="border-collapse:collapse">13000000 = 4 bytes for 32bit message payload, This is little endian for 19 bytes total.</span></div>
<div><span style="border-collapse:collapse"><br></span></div><div><span style="border-collapse:collapse">65 = 1 byte for message type. 65 is "Rversion" or the response type for a Tversion request</span></div>
<div><span style="border-collapse:collapse"><br></span></div><div><span style="border-collapse:collapse">ffff = 2 bytes for 16bit message "tag". </span></div>
<div><span style="border-collapse:collapse"><br></span></div><div><span style="border-collapse:collapse"><br></span></div><div><span style="border-collapse:collapse">00040000 = 4 bytes for the 32 bit maximum message payload size I'm negotiating with the 9P server. This is little endian for 1024</span></div>
<div><span style="border-collapse:collapse"><br></span></div><div><span style="border-collapse:collapse">0600 = 2 bytes for 16 bit value for the length of the "string" I'm sending. The strings are *NOT* null terminated in 9p, and this is little endian for 6 bytes remaining.</span></div>
<div><span style="border-collapse:collapse"><br></span></div><div><span class="Apple-style-span" style="border-collapse: collapse; ">5032303030 = 6 bytes the ASCII or UTF-8 string "9P2000" which is 6 bytes</span></div>
<div><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></div><div><span class="Apple-style-span" style="border-collapse: collapse;">4 + 1 + 2 + 4 + 2 + 6 = 19 bytes.</span></div><div><span class="Apple-style-span" style="border-collapse: collapse;"><br>
</span></div><div><span class="Apple-style-span" style="border-collapse: collapse;">As far as I can see, my "get" code does NOT ask for a 20th byte, so why am I getting that error?</span></div><div><span class="Apple-style-span" style="border-collapse: collapse;"><br>
</span></div><div><span class="Apple-style-span" style="border-collapse: collapse;"><div><font face="'comic sans ms', sans-serif">get = do s <- getWord32le -- 4</font></div><div><font face="'comic sans ms', sans-serif"> mtype <- getWord8 -- 1</font></div>
<div><font face="'comic sans ms', sans-serif"> getSpecific s mtype</font></div><div><font face="'comic sans ms', sans-serif"> where </font></div><div><font face="'comic sans ms', sans-serif"> getSpecific s mt </font></div>
<div><font face="'comic sans ms', sans-serif"> | mt == mtRversion = do t <- getWord16le -- 2</font></div><div><font face="'comic sans ms', sans-serif"> ms <- getWord32le -- 4</font></div>
<div><font face="'comic sans ms', sans-serif"> ss <- getWord16le -- 2</font></div><div><font face="'comic sans ms', sans-serif"> v <- getRemainingLazyByteString -- remaining should be 6 bytes.</font></div>
<div><font face="'comic sans ms', sans-serif"> return $ MessageClient $ Rversion {size=s,</font></div><div><font face="'comic sans ms', sans-serif"> mtype=mt,</font></div>
<div><font face="'comic sans ms', sans-serif"> tag=t,</font></div><div><font face="'comic sans ms', sans-serif"> msize=ms,</font></div>
<div><font face="'comic sans ms', sans-serif"> ssize=ss,</font></div><div><font face="'comic sans ms', sans-serif"> version=v}</font></div>
</span></div><div><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></div><div><span style="border-collapse:collapse">Should I file a bug? I don't believe I should be seeing an error message claiming a failure at the 20th byte when I've never asked for one. </span></div>
<div><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></div><div><span style="border-collapse:collapse">Dave<br></span><br><div class="gmail_quote">On Tue, Jun 2, 2009 at 10:51 AM, John Van Enk <span dir="ltr"><<a href="mailto:vanenkj@gmail.com" target="_blank">vanenkj@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thomas,<br>
<br>
You're correct. For some reason, I based my advice on the thought that<br>
19 was the minimum size instead of 13.<br>
<div><div></div><div><br>
On Tue, Jun 2, 2009 at 1:24 PM, Thomas DuBuisson<br>
<<a href="mailto:thomas.dubuisson@gmail.com" target="_blank">thomas.dubuisson@gmail.com</a>> wrote:<br>
>> I think getRemainingLazyByteString expects at least one byte<br>
> No, it works with an empty bytestring. Or, my tests do with binary 0.5.0.1.<br>
><br>
> The specific error means you are requiring more data than providing.<br>
> First check the length of the bytestring you pass in to the to level<br>
> decode (or 'get') routine and walk though that to figure out how much<br>
> it should be consuming. I notice you have a guard on the<br>
> 'getSpecific' function, hopefully you're sure the case you gave us is<br>
> the branch being taken.<br>
><br>
> I think the issue isn't with the code provided. I cleaned up the code<br>
> (which did change behavior due to the guard and data declarations that<br>
> weren't in the mailling) and it works fine all the way down to the<br>
> expected minimum of 13 bytes.<br>
><br>
><br>
>> import Data.ByteString.Lazy<br>
>> import Data.Binary<br>
>> import Data.Binary.Get<br>
>><br>
>> data RV =<br>
>> Rversion { size :: Word32,<br>
>> mtype :: Word8,<br>
>> tag :: Word16,<br>
>> msize :: Word32,<br>
>> ssize :: Word16,<br>
>> version :: ByteString}<br>
>> deriving (Eq, Ord, Show)<br>
><br>
>> instance Binary RV where<br>
>> get = do s <- getWord32le<br>
>> mtype <- getWord8<br>
>> getSpecific s mtype<br>
>> where<br>
>> getSpecific s mt = do t <- getWord16le<br>
>> ms <- getWord32le<br>
>> ss <- getWord16le<br>
>> v <- getRemainingLazyByteString<br>
>> return $ Rversion {size=s,<br>
>> mtype=mt,<br>
>> tag=t,<br>
>> msize=ms,<br>
>> ssize=ss,<br>
>> version=v }<br>
>> put _ = undefined<br>
><br>
<br>
<br>
<br>
</div></div>--<br>
<font color="#888888">/jve<br>
</font></blockquote></div><br></div>