diff --git a/src/ZooKeeper/Internal/Types.hsc b/src/ZooKeeper/Internal/Types.hsc
--- a/src/ZooKeeper/Internal/Types.hsc
+++ b/src/ZooKeeper/Internal/Types.hsc
@@ -3,17 +3,19 @@
 
 module ZooKeeper.Internal.Types where
 
-import           Control.Exception (bracket_)
-import           Control.Monad     (forM)
+import           Control.Exception     (bracket_)
+import           Control.Monad         (forM)
+import           Data.ByteString.Short (ShortByteString)
+import qualified Data.ByteString.Short as BShort (packCStringLen)
 import           Data.Int
 import           Foreign
 import           Foreign.C
-import           Numeric           (showHex)
-import           Z.Data.CBytes     (CBytes)
-import qualified Z.Data.CBytes     as CBytes
-import qualified Z.Data.Text       as Text
-import           Z.Data.Vector     (Bytes)
-import qualified Z.Foreign         as Z
+import           Numeric               (showHex)
+import qualified Z.Data.CBytes         as CBytes
+import           Z.Data.CBytes         (CBytes)
+import qualified Z.Data.Text           as Text
+import           Z.Data.Vector         (Bytes)
+import qualified Z.Foreign             as Z
 
 #include "hs_zk.h"
 
@@ -33,14 +35,17 @@
 
 data HsClientID = HsClientID
   { clientId     :: {-# UNPACK #-} !Int64
-  , clientPasswd :: {-# UNPACK #-} !CBytes
+  , clientPasswd :: {-# UNPACK #-} !ShortByteString
   } deriving (Show, Eq)
 
 peekClientId :: ClientID -> IO HsClientID
 peekClientId (ClientID ptr) = do
   client_id <- (#peek clientid_t, client_id) ptr
+  -- definition in c: char passwd[16];
+  let passwd_ptr = (#ptr clientid_t, passwd) ptr
+      passwd_len = (#size ((clientid_t *)0)->passwd)
   -- the pointer is getting from zhandle, so here we don't need to free it
-  passwd <- CBytes.fromCString =<< (#peek clientid_t, passwd) ptr
+  passwd <- BShort.packCStringLen (passwd_ptr, passwd_len)
   pure $ HsClientID{clientId=client_id, clientPasswd=passwd}
 
 newtype ZooLogLevel = ZooLogLevel CInt
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards   #-}
 
 module Main where
 
@@ -112,6 +113,12 @@
   describe "ZooKeeper.zooState" $ do
     it "test get state" $ do
       zooState zh `shouldReturn` ZooConnectedState
+
+  describe "ZooKeeper.zooClientID" $ do
+    it "test get data of ClientID" $ do
+      zooState zh `shouldReturn` ZooConnectedState
+      HsClientID{..} <- peekClientId =<< zooClientID zh
+      clientId `shouldNotBe` 0
 
   describe "ZooKeeper.zooRecvTimeout" $ do
     it "test receive timeout" $ do
diff --git a/zoovisitor.cabal b/zoovisitor.cabal
--- a/zoovisitor.cabal
+++ b/zoovisitor.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               zoovisitor
-version:            0.2.5.0
+version:            0.2.5.1
 synopsis:
   A haskell binding to Apache Zookeeper C library(mt) using Haskell Z project.
 
@@ -44,9 +44,10 @@
     ZooKeeper.Recipe.Utils
 
   build-depends:
-    , base        >=4.12  && <5
+    , base        >=4.12      && <5
+    , bytestring  >=0.10.10.0
     , exceptions  ^>=0.10
-    , Z-Data      >=0.7.2 && <1.5 || ^>=2.0
+    , Z-Data      >=0.7.2     && <1.5 || ^>=2.0
 
   includes:           hs_zk.h
   c-sources:          cbits/hs_zk.c
