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
