diff --git a/Data/ByteString/Parse.hs b/Data/ByteString/Parse.hs
--- a/Data/ByteString/Parse.hs
+++ b/Data/ByteString/Parse.hs
@@ -31,15 +31,21 @@
     , skip
     , skipWhile
     , skipAll
+    , takeStorable
     ) where
 
 import Control.Applicative
 import Control.Monad
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as B
+import qualified Data.ByteString.Internal as B (toForeignPtr)
 import Data.Word
+import Foreign.Storable (Storable, peekByteOff, sizeOf)
+import Foreign.ForeignPtr (withForeignPtr)
 import Prelude hiding (take, takeWhile)
 
+import System.IO.Unsafe (unsafePerformIO)
+
 -- | Simple parsing result, that represent respectively:
 --
 -- * failure: with the error message
@@ -160,6 +166,16 @@
                                 else err actual errMsg
 
 ------------------------------------------------------------
+
+-- | Take a storable from the current position in the stream
+takeStorable :: Storable d
+             => Parser d
+takeStorable = anyStorable undefined
+  where
+    anyStorable :: Storable d => d -> Parser d
+    anyStorable a = do
+        (fptr, off, _) <- B.toForeignPtr <$> take (sizeOf a)
+        return $ unsafePerformIO $ withForeignPtr fptr $ \ptr -> peekByteOff ptr off
 
 -- | Take @n bytes from the current position in the stream
 take :: Int -> Parser ByteString
diff --git a/bsparse.cabal b/bsparse.cabal
--- a/bsparse.cabal
+++ b/bsparse.cabal
@@ -1,5 +1,5 @@
 Name:                bsparse
-Version:             0.0.3
+Version:             0.0.4
 Synopsis:            A simple unassuming parser for bytestring
 Description:         Really trivial parser to get and drop bytes from a bytestring
 License:             BSD3
