最近看了下怎么编码解码base64,就顺便使用jni调用方法,编译成dll,给java使用。
这个base64没有按照base64标准,和apache的包一样没有进行76字符加换行符。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Base64Code.h"
/*code解码表*/
static char Base64Code[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7',
'8','9','+','/','=','\0'};
/*编码*/
char* encode(char *buf,int length)
{
char* enbuf,*p;
p=enbuf=malloc((length%3==0?length/3*4:(length/3+1)*4)*sizeof(char));
int i;
char b1,b2,b3,temp;/*辅助变量*/
/*3字节一次进行解码,没有满足3字节用0补充*/
for (i=0;i<length;i=i+3){
b1=buf[i];
*(p++)=Base64Code[((b1>>2)&0x3f)];
b2=(i+1)>=length?0:buf[i+1];
*(p++)=Base64Code[(((b1<<4)&0x3f)+((b2>>4)&0xf))];
b3=(i+2)>=length?0:buf[i+2];
/*补充的用code码表中的64位代替,就是=*/
temp=b2==0?64:(((b2<<2)&0x3f)+((b3>>6)&0x3));
*(p++)=Base64Code[temp];
*(p++)=Base64Code[b3==0?64:(b3&0x3f)];
}
*(p)='\0';/*字符串结尾*/
return enbuf;
}
/*取码表索引*/
char getIndex(char c,char* buf)
{
int i;
for (i=0;i<strlen(buf);++i){
if (c==buf[i]){return i;}
}
return 0;
}
/*解码*/
char* decode(char* buf,int length)
{
char b1,b2,b3,b4;
int i;
char* debuf,*p;
p=debuf=malloc((length/4*3)*sizeof(char));
/*4字节进行解码*/
for (i=0;i<length;i=i+4){
b1=getIndex(buf[i],Base64Code);
b2=getIndex(buf[i+1],Base64Code);
b3=getIndex(buf[i+2],Base64Code);
b4=getIndex(buf[i+3],Base64Code);
*(p++)=((b1<<2)+((b2>>4)&0x3));
/*64对应=号,表示原字节空*/
if (b3!=64){
*(p++)=((b2&0x0f)<<4)+((b3>>2)&0xf);
if (b4!=64){
*(p++)=((b3<<6)+b4);
}
}
}
*(p)='\0';
return debuf;
}
/*对应java中edBase方法*/
JNIEXPORT jbyteArray JNICALL Java_Base64Code_enBase(JNIEnv *env, jobject obj, jbyteArray array)
{
jbyte * buf;
/*获取字节数组*/
buf=(*env)->GetByteArrayElements(env,array,NULL);
/*GetArrayLength 取数组长度*/
char* enbuf=encode((char*)buf,(*env)->GetArrayLength(env,array));
printf("%s\n",enbuf);
/*new一个字节数组*/
jbyteArray enarray=(*env)->NewByteArray(env,strlen(enbuf));
(*env)->SetByteArrayRegion(env,enarray,0,strlen(enbuf),(jbyte*)enbuf);
return enarray;
}
/*对应java中deBase方法*/
JNIEXPORT jbyteArray JNICALL Java_Base64Code_deBase(JNIEnv *env, jobject obj, jbyteArray array)
{
jbyte * buf;
buf=(*env)->GetByteArrayElements(env,array,NULL);
/*解码*/
char* debuf=decode((char*)buf,(*env)->GetArrayLength(env,array));
jbyteArray dearray=(*env)->NewByteArray(env,strlen(debuf));
(*env)->SetByteArrayRegion(env,dearray,0,strlen(debuf),(jbyte*)debuf);
return dearray;
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Base64Code */
#ifndef _Included_Base64Code
#define _Included_Base64Code
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Base64Code
* Method: enBase
* Signature: ([B)[B
*/
JNIEXPORT jbyteArray JNICALL Java_Base64Code_enBase
(JNIEnv *, jobject, jbyteArray);
/*
* Class: Base64Code
* Method: deBase
* Signature: ([B)[B
*/
JNIEXPORT jbyteArray JNICALL Java_Base64Code_deBase
(JNIEnv *, jobject, jbyteArray);
#ifdef __cplusplus
}
#endif
#endif
java中调用代码。
import java.io.UnsupportedEncodingException;
public class Base64Code {
static{
System.loadLibrary("JniDemo");
}
public native byte[] enBase(byte[] buf);
public native byte[] deBase(byte[] buf);
public static void main(String[] args) throws UnsupportedEncodingException {
Base64Code base=new Base64Code();
byte[] b=base.enBase("不是吧iek34d".getBytes("utf-8"));//编码,编码格式自定义,dll只负责base64编码解码
System.out.println(new String(b,"utf-8"));
//byte[] buf=base.deBase("aWU0OWlma2Y=".getBytes("utf-8"));//解码,解码格式和编码相对应
//System.out.println(new String(buf,"utf-8"));
}
}