首页 > 代码库 > base64编码及JNI实现,代码非原创,只做整理和实现JNI端交互
base64编码及JNI实现,代码非原创,只做整理和实现JNI端交互
直接上代码:
#include <stdlib.h>#include <stdio.h>#include <getopt.h>#include <string.h>#include "base64.h"extern "C" {//Base64 编码int Base64Encode(unsigned char *OrgString, unsigned char *Base64String, int OrgStringLen) { int Base64StringLen = 0; static unsigned char Base64Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@"; 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 的倍数,则 Base64 编码有问题 { 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个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。