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[] = "ABCDEFGHIJKLMNOPQRSTUVWX[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 的倍数,则 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)

base64编码及JNI实现,代码非原创,只做整理和实现JNI端交互

时间: 2024-08-11 01:35:55

base64编码及JNI实现,代码非原创,只做整理和实现JNI端交互的相关文章

C# 字节流通过Base64编码转换成图片代码

C# 字节流通过Base64编码转换成图片代码 // 需载入以下的命名空间 // using System.IO; // using System.Drawing; // using System.Runtime.Serialization.Formatters.Binary; protected void Page_Load(object sender, EventArgs e) { byte[] buffer = ReadFile(Server.MapPath(@"\sex.txt"

BASE64编码原理与Golang代码调用

一.概念简介 Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符.3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示.它可用来作为电子邮件的传输编码.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同. Base64常用于在通常处理文本数据的场合,表示.传输.存储一些二进制数据 二.代码调用 在Golang中提供了

扫描线题目汇总 (里面的题解和代码非原创)

hdu 3867 Light and Shadow 转载自:http://blog.csdn.net/accry/article/details/6676009 题意: 原子弹爆炸,一些互不相交的线段,求能辐射到的线段个数(可以将原子弹爆炸点视为泛光源) 分析: 以辐射源为中心对周围的点按照极坐标角度进行排序,然后在极坐标上使用扫描线方法.维护一个集合,集合内的元素是与扫描线相交的线段,排序依据是线段与扫描线的交点到辐射源的距离.该集合中的最小元素就是被照射到的线段. 有关容器(set)排序依据

html圆环(该代码非原创,具体出处已不详)

<!doctype><html>    <head>        <title></title>        <meta charset="utf-8">    </head>    <style>        .circle {            width: 200px;            height: 200px;              position: abso

在浏览器中解析Base64编码图像

JavaWeb: 搞定验证码http://www.jianshu.com/p/9284a31e6ce8 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.imageio.ImageIO; import javax.imageio.stream.FileImageOutputStream; import java.awt.*; import java.awt.image.BufferedImage;

C#解码base64编码的二进制数据的代码

将做工程过程常用的代码片段做个珍藏,下边代码段是关于C#解码base64编码的二进制数据的代码.using System;static class MyModClass{public static byte[] Base64DecodeString(this string inputStr){byte[] decodedByteArray = Convert.FromBase64String(inputStr);return (decodedByteArray);}} 原文地址:https://

【前端攻略】:玩转图片Base64编码

引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的Base64编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的base64编码.标题略大,不过只是希望通过一些浅显的论述,让你知道什么是图片的base64编码,为什么我们要用它,我们如何使用并且方便的使用它,并让你懂得如何去在前端的实际工作中运用它. 什么是base64编码? 我不是来讲概念的,直接切入正题,图片的base64编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址. 这样做有什么意义呢?我

新辰:SEOer如何降低非原创文章带来的影响?

1.相关资料 官方文档:http://htmlparser.sourceforge.net/samples.html API:http://htmlparser.sourceforge.net/javadoc/index.html 其它HTML 解释器:jsoup等.由于HtmlParser自2006年以后就再没更新,目前很多人推荐使用jsoup代替它. 2.使用HtmlPaser的关键步骤 (1)通过Parser类创建一个解释器 (2)创建Filter或者Visitor (3)使用parser

iOS Base64编码(文字/图片)

Base64 是网络上常见的用于传输8bit字节代码的编码方式之一,可以将二进制转为"字符串".在应用程序中常常需要把二进制数据编码为适合放在URL中的形式,此时采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼直接看到. 然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准的Base64中的'/'和'+'字符变为'%XX'的形式,而这些'%'号在存入数据库时还需要再进行转换,因为ANSI SQL中将'%'号用作通配符.为解决此问题,可采用一种用于