diff --git a/dlqrcode/src/lib.rs b/dlqrcode/src/lib.rs
index 81cbe91..8a98de0 100644
--- a/dlqrcode/src/lib.rs
+++ b/dlqrcode/src/lib.rs
@@ -293,7 +293,6 @@
     }
 }
 
-
 pub fn transaction_sign(qrdata: &DaliQrData) -> String {
     let sign_str = qrdata.to_qrdata();
     let key = Aes256Cbc::new_var(MASTER.as_bytes(), &MASTER_IV).unwrap();
@@ -334,7 +333,6 @@
     Ok(tac)
 }
 
-
 #[cfg(test)]
 mod tests {
     use super::*;
diff --git a/dlsmk/src/lib.rs b/dlsmk/src/lib.rs
index 14538d9..909632f 100644
--- a/dlsmk/src/lib.rs
+++ b/dlsmk/src/lib.rs
@@ -42,9 +42,7 @@
     use self::jni::objects::{JClass, JMap, JObject, JString};
     use self::jni::sys::{jboolean, jint, jlong, jstring, JNI_FALSE, JNI_TRUE};
     use self::jni::JNIEnv;
-    // use super::*;
-    use libc;
-    use std::slice;
+    use std::ffi::CStr;
 
     use log::debug;
 
@@ -72,10 +70,7 @@
                 .get_string(key_hex)
                 .expect("invalid key string")
                 .as_ptr();
-            let keylen = libc::strlen(s);
-            let mut k = Vec::new();
-            k.extend_from_slice(slice::from_raw_parts(s as *const u8, keylen));
-            k
+            String::from(CStr::from_ptr(s).to_string_lossy())
         };
 
         let qrcode = {
@@ -83,17 +78,14 @@
                 .get_string(qrcode)
                 .expect("invalid qrcode string")
                 .as_ptr();
-            let qrlen = libc::strlen(s);
-            let mut q = Vec::new();
-            q.extend_from_slice(slice::from_raw_parts(s as *const u8, qrlen));
-            q
+            String::from(CStr::from_ptr(s).to_string_lossy())
         };
 
         let qrdata = env.get_map(result).expect("invalid qrdata map");
 
         let (key, step, skew) = {
             let mut k = [0u8; 32];
-            if let Ok(v) = base64::decode_config(key.as_slice(), base64::URL_SAFE) {
+            if let Ok(v) = base64::decode_config(key, base64::URL_SAFE) {
                 if v.len() != 35 {
                     put_data(&env, &qrdata, "error", "key format error");
                     return JNI_FALSE;
@@ -123,6 +115,7 @@
             }
         };
 
+
         match decoder.decode(qrcode.as_ptr(), qrcode.len(), offset as i32) {
             Ok(d) => {
                 put_data(&env, &qrdata, "cardno", &d.cardno);
@@ -143,9 +136,13 @@
     const VERSION: &'static str = env!("CARGO_PKG_VERSION");
 
     #[no_mangle]
-    pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_version(env: JNIEnv,
-        _: JClass) -> jstring {
-        let s = env.new_string(String::from(VERSION)).expect("would't get version");
+    pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_version(
+        env: JNIEnv,
+        _: JClass,
+    ) -> jstring {
+        let s = env
+            .new_string(String::from(VERSION))
+            .expect("would't get version");
         s.into_inner()
     }
 
@@ -161,16 +158,14 @@
     ) -> jboolean {
         let qrsign = {
             let s = env.get_string(qrsign).expect("invalid key string").as_ptr();
-            let keylen = libc::strlen(s);
-            String::from_raw_parts(s as *mut u8, keylen, keylen)
+            String::from(CStr::from_ptr(s).to_string_lossy())
         };
         let cardno = {
             let s = env
                 .get_string(cardno)
                 .expect("invalid cardno string")
                 .as_ptr();
-            let len = libc::strlen(s);
-            String::from_raw_parts(s as *mut u8, len, len)
+            String::from(CStr::from_ptr(s).to_string_lossy())
         };
 
         let termDatetime = {
@@ -178,8 +173,7 @@
                 .get_string(termDatetime)
                 .expect("invalid datetime")
                 .as_ptr();
-            let len = libc::strlen(s);
-            String::from_raw_parts(s as *mut u8, len, len)
+            String::from(CStr::from_ptr(s).to_string_lossy())
         };
 
         let result = env.get_map(result).expect("invalid qrdata map");
@@ -189,7 +183,12 @@
             return JNI_FALSE;
         }
 
-        match dlqrcode::transaction_tac(&cardno, amount, &termDatetime, &qrsign) {
+        match dlqrcode::transaction_tac(
+            &cardno,
+            amount,
+            &termDatetime,
+            &qrsign
+        ) {
             Ok(tac) => {
                 put_data(&env, &result, "tac", &tac);
                 JNI_TRUE
