Przeglądaj źródła

change: usc2编解码统一到str文件里

豆豆 6 miesięcy temu
rodzic
commit
cfe58e3dce

+ 4 - 4
components/sms/binding/luat_lib_sms.c

@@ -79,7 +79,7 @@ static void push_sms_args(lua_State* L, LUAT_SMS_RECV_MSG_T* sms, char* dst, siz
     memcpy(phone, sms->phone_address, strlen(sms->phone_address));
     if (strlen(phone) > 4 && phone[0] == '0' && phone[1] == '0' && strlen(phone) % 2 == 0) {
         // 看来是ucs编码了
-        ucs2char(sms->phone_address, strlen(sms->phone_address), phone, &outlen);
+        luat_str_ucs2_to_char(sms->phone_address, strlen(sms->phone_address), phone, &outlen);
         phone[outlen] = 0x00;
     }
     lua_pushstring(L, phone);
@@ -147,7 +147,7 @@ static int l_sms_recv_handler(lua_State* L, void* ptr) {
         memcpy(dst, sms->sms_buffer, strlen(sms->sms_buffer));
     }
     else {
-        ucs2char(sms->sms_buffer, strlen(sms->sms_buffer), dst, &dstlen);
+        luat_str_ucs2_to_char(sms->sms_buffer, strlen(sms->sms_buffer), dst, &dstlen);
         dst[dstlen] = 0;
     }
 
@@ -388,7 +388,7 @@ static int l_sms_send(lua_State *L) {
     }
     memset(ucs2_buf, 0x00, payload_len * 3);
 
-    ret = utf82ucs2(payload, payload_len, ucs2_buf, payload_len * 3, &outlen);
+    ret = luat_str_utf8_to_ucs2(payload, payload_len, ucs2_buf, payload_len * 3, &outlen);
 
     if (ret) {
         LLOGE("utf82ucs2 encode fail");
@@ -497,7 +497,7 @@ static int l_long_sms_send(lua_State *L) {
 
     memset(ucs2_buf, 0x00, payload_len * 3);
 
-    int ret = utf82ucs2(payload, payload_len, ucs2_buf, payload_len * 3, &outlen);
+    int ret = luat_str_utf8_to_ucs2(payload, payload_len, ucs2_buf, payload_len * 3, &outlen);
 
     if (ret) {
         LLOGE("utf8 to ucs2 fail ret");

+ 0 - 4
components/sms/include/luat_sms.h

@@ -175,9 +175,5 @@ void luat_sms_send_msg_register_handler(LUAT_SMS_HANDLE_SEND_CB callback_fun);
  */
 int luat_sms_pdu_packet(luat_sms_pdu_packet_t *packet);
 
-void ucs2char(char* source, size_t size, char* dst2, size_t* outlen);
-int utf82ucs2(char* source, size_t source_len, char* dst, size_t dstlen, size_t* outlen);
-
-
 /**@}*/
 #endif

+ 0 - 73
components/sms/src/luat_sms.c

@@ -12,79 +12,6 @@ static int hex2int(char c)
     return -1;
 }
 
-
-void ucs2char(char* source, size_t size, char* dst2, size_t* outlen) {
-    char buff[size + 2];
-    memset(buff, 0, size + 2);
-    luat_str_fromhex(source, size, buff);
-    uint16_t* tmp = (uint16_t*)buff;
-    char* dst = dst2;
-    uint16_t unicode = 0;
-    size_t dstlen = 0;
-    while (1) {
-        unicode = *tmp ++;
-        unicode = ((unicode >> 8) & 0xFF) + ((unicode & 0xFF) << 8);
-        if (unicode == 0)
-            break; // 终止了
-        if (unicode <= 0x0000007F) {
-            dst[dstlen++] = (unicode & 0x7F);
-            continue;
-        }
-        if (unicode <= 0x000007FF) {
-            dst[dstlen++]	= ((unicode >> 6) & 0x1F) | 0xC0;
-		    dst[dstlen++] 	= (unicode & 0x3F) | 0x80;
-            continue;
-        }
-        if (unicode <= 0x0000FFFF) {
-            dst[dstlen++]	= ((unicode >> 12) & 0x0F) | 0xE0;
-		    dst[dstlen++]	= ((unicode >>  6) & 0x3F) | 0x80;
-		    dst[dstlen++]	= (unicode & 0x3F) | 0x80;
-            continue;
-        }
-        break;
-    }
-    *outlen = dstlen;
-}
-
-int utf82ucs2(char* source, size_t source_len, char* dst, size_t dstlen, size_t* outlen) {
-    uint16_t unicode = 0;
-    size_t tmplen = 0;
-    for (size_t i = 0; i < source_len; i++)
-    {
-        if(tmplen >= dstlen) {
-            return -1;
-        }
-        // 首先是不是单字节
-        if (source[i] & 0x80) {
-            // 非ASCII编码
-            if (source[i] && 0xE0) { // 1110xxxx 10xxxxxx 10xxxxxx
-                unicode = ((source[i] & 0x0F) << 12) + ((source[i+1] & 0x3F) << 6) + (source[i+2] & 0x3F);
-                dst[tmplen++] = (unicode >> 8) & 0xFF;
-                dst[tmplen++] = unicode & 0xFF;
-                i+=2;
-                continue;
-            }
-            if (source[i] & 0xC0) { // 110xxxxx 10xxxxxx
-                unicode = ((source[i] & 0x1F) << 6) + (source[i+1] & 0x3F);
-                dst[tmplen++] = (unicode >> 8) & 0xFF;
-                dst[tmplen++] = unicode & 0xFF;
-                i++;
-                continue;
-            }
-            return -1;
-        }
-        // 单个ASCII字符, 但需要扩展到2位
-        else {
-            // ASCII编码
-            dst[tmplen++] = 0x00;
-            dst[tmplen++] = source[i];
-            continue;
-        }
-    }
-    *outlen = tmplen;
-    return 0;
-}
-
 int luat_sms_pdu_packet(luat_sms_pdu_packet_t *packet)
 {
     // 先处理一下电话号码

+ 72 - 0
lua/src/lstrlib_exts.c

@@ -78,6 +78,78 @@ size_t luat_str_fromhex_ex(const char* str, size_t len, char* buff) {
 	return out_len;
 }
 
+void luat_str_ucs2_to_char(char* source, size_t size, char* dst2, size_t* outlen) {
+    char buff[size + 2];
+    memset(buff, 0, size + 2);
+    luat_str_fromhex(source, size, buff);
+    uint16_t* tmp = (uint16_t*)buff;
+    char* dst = dst2;
+    uint16_t unicode = 0;
+    size_t dstlen = 0;
+    while (1) {
+        unicode = *tmp ++;
+        unicode = ((unicode >> 8) & 0xFF) + ((unicode & 0xFF) << 8);
+        if (unicode == 0)
+            break; // 终止了
+        if (unicode <= 0x0000007F) {
+            dst[dstlen++] = (unicode & 0x7F);
+            continue;
+        }
+        if (unicode <= 0x000007FF) {
+            dst[dstlen++]	= ((unicode >> 6) & 0x1F) | 0xC0;
+		    dst[dstlen++] 	= (unicode & 0x3F) | 0x80;
+            continue;
+        }
+        if (unicode <= 0x0000FFFF) {
+            dst[dstlen++]	= ((unicode >> 12) & 0x0F) | 0xE0;
+		    dst[dstlen++]	= ((unicode >>  6) & 0x3F) | 0x80;
+		    dst[dstlen++]	= (unicode & 0x3F) | 0x80;
+            continue;
+        }
+        break;
+    }
+    *outlen = dstlen;
+}
+
+int luat_str_utf8_to_ucs2(char* source, size_t source_len, char* dst, size_t dstlen, size_t* outlen) {
+    uint16_t unicode = 0;
+    size_t tmplen = 0;
+    for (size_t i = 0; i < source_len; i++)
+    {
+        if(tmplen >= dstlen) {
+            return -1;
+        }
+        // 首先是不是单字节
+        if (source[i] & 0x80) {
+            // 非ASCII编码
+            if (source[i] && 0xE0) { // 1110xxxx 10xxxxxx 10xxxxxx
+                unicode = ((source[i] & 0x0F) << 12) + ((source[i+1] & 0x3F) << 6) + (source[i+2] & 0x3F);
+                dst[tmplen++] = (unicode >> 8) & 0xFF;
+                dst[tmplen++] = unicode & 0xFF;
+                i+=2;
+                continue;
+            }
+            if (source[i] & 0xC0) { // 110xxxxx 10xxxxxx
+                unicode = ((source[i] & 0x1F) << 6) + (source[i+1] & 0x3F);
+                dst[tmplen++] = (unicode >> 8) & 0xFF;
+                dst[tmplen++] = unicode & 0xFF;
+                i++;
+                continue;
+            }
+            return -1;
+        }
+        // 单个ASCII字符, 但需要扩展到2位
+        else {
+            // ASCII编码
+            dst[tmplen++] = 0x00;
+            dst[tmplen++] = source[i];
+            continue;
+        }
+    }
+    *outlen = tmplen;
+    return 0;
+}
+
 /*
 将字符串转成HEX
 @api string.toHex(str, separator)

+ 2 - 0
luat/include/luat_str.h

@@ -6,6 +6,7 @@
 void luat_str_tohexwithsep(const char* str, size_t len, char* separator, size_t len_j, char* buff);
 void luat_str_tohex(const char* str, size_t len, char* buff);
 void luat_str_fromhex(const char* str, size_t len, char* buff);
+void luat_str_ucs2_to_char(char* source, size_t size, char* dst2, size_t* outlen);
 
 int luat_str_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,
                    const unsigned char *src, size_t slen );
@@ -14,5 +15,6 @@ int luat_str_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
 
 int luat_str_base32_decode(const uint8_t *encoded, uint8_t *result, int bufSize);
 int luat_str_base32_encode(const uint8_t *data, int length, uint8_t *result,int bufSize);
+int luat_str_utf8_to_ucs2(char* source, size_t source_len, char* dst, size_t dstlen, size_t* outlen);
 
 #endif