jni调用c编码解码base64

12 篇文章 1 订阅

最近看了下怎么编码解码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;
}



jni生成的头文件

/* 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"));
	}
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值