diff --git a/src/Foreign/C/ByteArray.hs b/src/Foreign/C/ByteArray.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/C/ByteArray.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE ImportQualifiedPost #-}
+{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
+
+module Foreign.C.ByteArray where
+
+import Foreign.Ptr
+import Foreign.C.String
+import Data.Word
+import Data.ByteString qualified as BS
+
+type CByteArray = (Ptr Word8, Int)
+
+fromCStringLen :: CStringLen -> CByteArray
+fromCStringLen (p, n) = (castPtr p, n)
+
+toCStringLen :: CByteArray -> CStringLen
+toCStringLen (p, n) = (castPtr p, n)
+
+packToByteString :: CByteArray -> IO BS.ByteString
+packToByteString = BS.packCStringLen . toCStringLen
+
+useAsFromByteString :: BS.ByteString -> (CByteArray -> IO a) -> IO a
+useAsFromByteString bs f = BS.useAsCStringLen bs $ f . fromCStringLen
diff --git a/tools-yj.cabal b/tools-yj.cabal
--- a/tools-yj.cabal
+++ b/tools-yj.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           tools-yj
-version:        0.1.0.40
+version:        0.1.0.41
 synopsis:       Tribial tools
 description:    Please see the README on GitHub at <https://github.com/YoshikuniJujo/tools-yj#readme>
 category:       Tools
@@ -46,6 +46,7 @@
       Data.Tuple.ToolsYj
       Data.Word.Adler32
       Data.Word.Crc32
+      Foreign.C.ByteArray
       Text.Show.ToolsYj
   other-modules:
       Paths_tools_yj
