標籤: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)