
On Tue, Mar 6, 2012 at 7:47 PM, David McBride
While I like your pre-zipping solution, I see why it didn't work out well for you. The way that I've done such things is with folds. The thing is that you need to store both the final answer as well as the index of the bytestring where you are so that the supplied function can know what power to take 256 to at each step. Here's how I would do it.
totalBS :: ByteString -> Integer totalBS bs = ans where (_,ans) = foldr' func (0,0) (BS.reverse bs) func byte (acc,ans) = (acc+1, ans + fromIntegral byte * (256^acc))
This should work on any size bytestring.
Rather than doing this you can simply multiply by 256 because a + 256 b + 256² c == a + 256 ( b + 256 c ) So :
totalBS :: ByteString -> Integer totalBS = BS.foldr' (\byte total -> fromIntegral byte + 256 * total) 0
This is an idiom often used :) Note that for normal sized words and if your parser become more complicated, you should look at the binary package to parse streams of bytes. -- Jedaï