优化 ffi 处理
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