base64編碼及JNI實現,代碼非原創,只做整理和實現JNI端互動

來源:互聯網
上載者:User

標籤:des   android   style   class   blog   code   

直接上代碼:

#include <stdlib.h>#include <stdio.h>#include <getopt.h>#include <string.h>#include "base64.h"extern "C" {//Base 64 編碼int Base64Encode(unsigned char *OrgString, unsigned char *Base64String, int OrgStringLen) {    int Base64StringLen = 0;    static unsigned char Base64Encode[] = "[email protected]";    while (OrgStringLen > 0) {        *Base64String++ = Base64Encode[(OrgString[0] >> 2) & 0x3f];        if (OrgStringLen > 2) {            *Base64String++ = Base64Encode[((OrgString[0] & 3) << 4)                    | (OrgString[1] >> 4)];            *Base64String++ = Base64Encode[((OrgString[1] & 0xF) << 2)                    | (OrgString[2] >> 6)];            *Base64String++ = Base64Encode[OrgString[2] & 0x3F];        } else {            switch (OrgStringLen) {            case 1:                *Base64String++ = Base64Encode[(OrgString[0] & 3) << 4];                *Base64String++ = ‘_‘;                *Base64String++ = ‘_‘;                break;            case 2:                *Base64String++ = Base64Encode[((OrgString[0] & 3) << 4)                        | (OrgString[1] >> 4)];                *Base64String++ = Base64Encode[((OrgString[1] & 0x0F) << 2)                        | (OrgString[2] >> 6)];                *Base64String++ = ‘_‘;                break;            }        }        OrgString += 3;        OrgStringLen -= 3;        Base64StringLen += 4;    }    *Base64String = ‘\0‘;    return Base64StringLen;}//Base64 解碼char GetBase64Value(unsigned char ch) //得到編碼值        {    if ((ch >= ‘A‘) && (ch <= ‘Z‘))  // A ~ Z        return ch - ‘A‘;    if ((ch >= ‘a‘) && (ch <= ‘z‘))  // a ~ z        return ch - ‘a‘ + 26;    if ((ch >= ‘0‘) && (ch <= ‘9‘))  // 0 ~ 9        return ch - ‘0‘ + 52;    switch (ch)       // 其它字元    {    case ‘.‘:        return 62;    case ‘@‘:        return 63;    case ‘_‘:  //Base64 填充字元        return 0;    default:        return 0;    }}// 解碼函數int Base64Decode(unsigned char *OrgString, unsigned char *Base64String, int Base64StringLen,bool bForceDecode)  //解碼函數   {    if (Base64StringLen % 4 && !bForceDecode)   //如果不是 4 的倍數,則 Base 64 編碼有問題            {        OrgString[0] = ‘\0‘;        return -1;    }    unsigned char Base64Encode[4];    int OrgStringLen = 0;    while (Base64StringLen > 2)  //當待解碼個數不足3個時,將忽略它(強制解碼時有效)    {        Base64Encode[0] = GetBase64Value(Base64String[0]);        Base64Encode[1] = GetBase64Value(Base64String[1]);        Base64Encode[2] = GetBase64Value(Base64String[2]);        Base64Encode[3] = GetBase64Value(Base64String[3]);        *OrgString++ = (Base64Encode[0] << 2) | (Base64Encode[1] >> 4);        *OrgString++ = (Base64Encode[1] << 4) | (Base64Encode[2] >> 2);        *OrgString++ = (Base64Encode[2] << 6) | (Base64Encode[3]);        Base64String += 4;        Base64StringLen -= 4;        OrgStringLen += 3;    }    return OrgStringLen;}//Base64 函數完畢}

Jni互動代碼

/* * Class:     com_encrypt_EncryptActivity * Method:    base64Encrypt * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_encrypt_EncryptActivity_base64Encrypt(        JNIEnv *env, jobject, jstring str) {    //接收java端傳過來的字串變數,需要編碼的字串    const char *string;    //base64加密後字串指標    unsigned char *base64String;    //接收java端字串    string = env->GetStringUTFChars(str, 0);    //計算出字串的長度    int len = strlen(string) + 1;    //為字串分配空間,通常為4個位元組一組,且加密後長度小於2倍的長度加4    base64String = new unsigned char[len * 2 + 4];    //進行base64編碼    Base64Encode((unsigned char *) string, base64String, len);    __android_log_print(ANDROID_LOG_INFO, "[INFO][Base64Encyrpt]",            "hello, base64 encode \n%s", (char *) base64String);    //釋放出從java端接收的字串    env->ReleaseStringUTFChars(str, string);    //返回加密的字串到java端    return env->NewStringUTF((char *) base64String);}/* * Class:     com_encrypt_EncryptActivity * Method:    base64Decrypt * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_encrypt_EncryptActivity_base64Decrypt(        JNIEnv *env, jobject, jstring str) {    //base64解碼後字串指標    unsigned char *decodeStr;    //接收java端傳過來的字串變數    const char *datestring;    //接收java端字串    datestring = env->GetStringUTFChars(str, 0);    //字串的長度    int len = strlen(datestring) + 1;    //為字串分配空間    decodeStr = new unsigned char[len];    //base64解碼    Base64Decode(decodeStr, (unsigned char *) datestring, len, true);    __android_log_print(ANDROID_LOG_INFO, "[INFO][Base64Decyrpt]",            "hello, base64 decode \n%s!", decodeStr);    //釋放出從java端接收的字串    env->ReleaseStringUTFChars(str, datestring);    //返回解碼的字串到java端    return env->NewStringUTF((char *) decodeStr);}

java端聲明:

    public native String base64Encrypt(String str);    public native String base64Decrypt(String str);

載入庫:

    static {        System.loadLibrary("產生的庫名稱");    }

檔案下載:base64編碼
http://192.210.60.138/dz/forum.php?mod=viewthread&tid=15&fromuid=1
(出處: IStudy)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.