有谁知道av网址吗这个网址告知一下,万分感谢

Base64编解码Android和ios的例子,补充JNI中的例子 - 北门锁钥 - ITeye技术网站
博客分类:
1.在Android中java层提供了工具类:android.util.Base64;
里面都是静态方法,方便直接使用:
使用方法如下:
// Base64 编码:
byte [] encode = Base64.encode("Hello, World".getBytes(), Base64.DEFAULT);
String enc = new String(encode);
Log.d("","base 64 encode = " + enc);
// Base64 解码:
byte [] result = Base64.decode("SGVsbG8sIFdvcmxk", Base64.DEFAULT);
String res = new String(result);
Log.d("", "base 64 result = " + res);
例子演示了将"Hello, World"编码成"SGVsbG8sIFdvcmxk",然后又解码回来。简单易懂。
2.对于ios来说,有google的提供的一个工具箱来解决。
网址:/p/google-toolbox-for-mac/
需要从里面找出3个文件:GTMBase64.h,GTMBase64.m,GTMDefines.h
将这三个文件加入ios工程中即可使用了。
NSLog(@"%@", [selfencodeBase64:@"Hello, World"]);
NSLog(@"%@", [selfdecodeBase64:@"SGVsbG8sIFdvcmxk"]);
调用的自己封装的函数:
- (NSString *) encodeBase64:(NSString *) input{
NSData *data = [input dataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64S
- (NSString *) decodeBase64:(NSString *) input{
NSData *data = [input dataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];
data = [GTMBase64 decodeData:data];
NSString *string = [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding];
3.在Android中,我们也可以将base64的编解码算法放到jni中,这样也是比较方便的。
对应的c中算法如下:
#include "com_example_base64test_JniTest.h"
#include &stdlib.h&
#include &android/log.h& // 这个是输出LOG所用到的函数所在的路径
#define LOG_TAG
"JNILOG" // 这个是自定义的LOG的标识
#undef LOG // 取消默认的LOG
#define LOGD(...)
__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) // 定义LOG类型
#define LOGI(...)
__android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) // 定义LOG类型
#define LOGW(...)
__android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) // 定义LOG类型
#define LOGE(...)
__android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) // 定义LOG类型
#define LOGF(...)
__android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__) // 定义LOG类型
const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/=";
char* base64_encode(const char* data, int data_len);
char *base64_decode(const char* data, int data_len);
static char find_pos(char ch);
com_example_base64test_JniTest
* Signature: (Ljava/lang/S)Ljava/lang/S
JNIEXPORT jstring JNICALL Java_com_example_base64test_JniTest_encode
(JNIEnv *env, jobject obj, jstring string)
// 先将jstring转换成char*
char *t = 0;
jclass clsstring = env-&FindClass("java/lang/String");
jstring strencode = env-&NewStringUTF("utf-8");
jmethodID mid = env-&GetMethodID(clsstring, "getBytes", "(Ljava/lang/S)[B");
jbyteArray barr= (jbyteArray)env-&CallObjectMethod(string, mid, strencode);
jsize alen = env-&GetArrayLength(barr);
jbyte* ba = env-&GetByteArrayElements(barr, JNI_FALSE);
if (alen & 0)
t = (char*)malloc(alen + 1);
memcpy(t, ba, alen);
t[alen] = 0;
env-&ReleaseByteArrayElements(barr, ba, 0);
// 此时的t里面有了jstring的内容
int i = 0;
int j = strlen(t);
char *enc = base64_encode(t, j);
int len = strlen(enc);
char *dec = base64_decode(enc, len);
LOGD("\noriginal: %s\n", t);
LOGD("\nencoded : %s\n", enc);
LOGD("\ndecoded : %s\n", dec);
free(enc);
free(dec);
// 将base64编码后的char转换成jstring返回给java层
jclass strClass = env-&FindClass("Ljava/lang/S");
jclass strClass = env-&FindClass("java/lang/String");
jmethodID ctorID = env-&GetMethodID(strClass, "&init&", "([BLjava/lang/S)V");
jbyteArray bytes = env-&NewByteArray(strlen(enc));
env-&SetByteArrayRegion(bytes, 0, strlen(enc), (jbyte*)enc);
jstring encoding = env-&NewStringUTF("UTF-8");
jchar encoding_name[] = { 'U', 'T', 'F', '-', '8'};
jstring encoding = env-&NewString(encoding_name, 5);
return (jstring)env-&NewObject(strClass, ctorID, bytes, encoding);
jbyte buffer[] = /* UTF8 encoding buffer */
jbyteArray bytes = env-&NewByteArray(sizeof(buffer));
env-&SetByteArrayRegion(bytes, 0, sizeof(buffer), buffer);
com_example_base64test_JniTest
* Signature: (Ljava/lang/S)Ljava/lang/S
JNIEXPORT jstring JNICALL Java_com_example_base64test_JniTest_decode
(JNIEnv *env, jobject obj, jstring base)
// 先将jstring转换成char*
char *t = 0;
jclass clsstring = env-&FindClass("java/lang/String");
jstring strencode = env-&NewStringUTF("utf-8");
jmethodID mid = env-&GetMethodID(clsstring, "getBytes", "(Ljava/lang/S)[B");
jbyteArray barr= (jbyteArray)env-&CallObjectMethod(base, mid, strencode);
jsize alen = env-&GetArrayLength(barr);
jbyte* ba = env-&GetByteArrayElements(barr, JNI_FALSE);
if (alen & 0)
t = (char*)malloc(alen + 1);
memcpy(t, ba, alen);
t[alen] = 0;
env-&ReleaseByteArrayElements(barr, ba, 0);
// 此时的t里面有了jstring的内容
int i = 0;
int j = strlen(t);
char *enc = base64_encode(t, j);
int len = strlen(enc);
char *dec = base64_decode(t, j);
LOGD("\noriginal: %s\n", t);
LOGD("\nencoded : %s\n", enc);
LOGD("\ndecoded : %s\n", dec);
free(enc);
free(dec);
// 将base64编码后的char转换成jstring返回给java层
jclass strClass = env-&FindClass("Ljava/lang/S");
jclass strClass = env-&FindClass("java/lang/String");
jmethodID ctorID = env-&GetMethodID(strClass, "&init&", "([BLjava/lang/S)V");
jbyteArray bytes = env-&NewByteArray(strlen(dec));
env-&SetByteArrayRegion(bytes, 0, strlen(dec), (jbyte*)dec);
jstring encoding = env-&NewStringUTF("utf-8");
jobject result = env-&NewObject(strClass, ctorID, bytes, encoding);
return (jstring)env-&NewObject(strClass, ctorID, bytes, encoding);
char *base64_encode(const char* data, int data_len)
//int data_len = strlen(data);
int prepare = 0;
int temp = 0;
char *ret = NULL;
char *f = NULL;
int tmp = 0;
char changed[4];
int i = 0;
ret_len = data_len / 3;
temp = data_len % 3;
if (temp & 0)
ret_len += 1;
ret_len = ret_len*4 + 1;
ret = (char *)malloc(ret_len);
if ( ret == NULL)
LOGD("No enough memory.\n");
memset(ret, 0, ret_len);
while (tmp & data_len)
prepare = 0;
memset(changed, '\0', 4);
while (temp & 3)
//printf("tmp = %d\n", tmp);
if (tmp &= data_len)
prepare = ((prepare && 8) | (data[tmp] & 0xFF));
prepare = (prepare&&((3-temp)*8));
//printf("before for : temp = %d, prepare = %d\n", temp, prepare);
for (i = 0; i & 4 ;i++ )
if (temp & i)
changed[i] = 0x40;
changed[i] = (prepare&&((3-i)*6)) & 0x3F;
*f = base[changed[i]];
//printf("%.2X", changed[i]);
*f = '\0';
static char find_pos(char ch)
char *ptr = (char*)strrchr(base, ch);//the last position (the only) in base[]
return (ptr - base);
char *base64_decode(const char *data, int data_len)
int ret_len = (data_len / 4) * 3;
int equal_count = 0;
char *ret = NULL;
char *f = NULL;
int tmp = 0;
int temp = 0;
char need[3];
int prepare = 0;
int i = 0;
if (*(data + data_len - 1) == '=')
equal_count += 1;
if (*(data + data_len - 2) == '=')
equal_count += 1;
if (*(data + data_len - 3) == '=')
{//seems impossible
equal_count += 1;
switch (equal_count)
ret_len += 4;//3 + 1 [1 for NULL]
ret_len += 4;//Ceil((6*3)/8)+1
ret_len += 3;//Ceil((6*2)/8)+1
ret_len += 2;//Ceil((6*1)/8)+1
ret = (char *)malloc(ret_len);
if (ret == NULL)
LOGD("No enough memory.\n");
memset(ret, 0, ret_len);
while (tmp & (data_len - equal_count))
prepare = 0;
memset(need, 0, 4);
while (temp & 4)
if (tmp &= (data_len - equal_count))
prepare = (prepare && 6) | (find_pos(data[tmp]));
prepare = prepare && ((4-temp) * 6);
for (i=0; i&3 ;i++ )
if (i == temp)
*f = (char)((prepare&&((2-i)*8)) & 0xFF);
*f = '\0';
不过这个例子里面,log打印的都是正确的,可是返回到java层的确是乱码,这个问题暂时还没有解决。希望有明白的同志告知一下。谢谢。工程附件中。
(687.1 KB)
下载次数: 82
下载次数: 47
下载次数: 80
浏览 16952
浏览: 245307 次
来自: 北京
纳尼,我发现我还是有这个问题
哥们 编译好的库如何使用呢?我都不晓得这个库中的函数是什么 我 ...
很明显,试验失败了,如果大家知道怎么搞的话,请回复。估计还是得 ...
tofaluanle 写道我使用你这个demo测试通过。然后我 ...主题 : NSASCIIStringEncoding vs NSUTF8StringEncoding
级别: 新手上路
可可豆: 30 CB
威望: 29 点
在线时间: 235(时)
发自: Web Page
NSASCIIStringEncoding vs NSUTF8StringEncoding
NSString * str = [[NSString alloc]initWithCString:(const char *)arr encoding:NSASCIIStringEncoding];
int len = str.
str = [str&substringToIndex:len-2];
项目总有用到上面这样一段代码,在自己设备上测试良好,但在审核时被 reject ,说这句
&str = [str&substringToIndex:len-2];&有问题,怀疑是 arr 转str 不成功,是不是字符编码的问题,求解,加急.....
UID: 38060
发帖: 137580
可可豆: 1373716 CB
威望: 1374133 点
在线时间: 2216(时)
发自: Web Page
就算抛开字符编码的问题,首先你这行代码就没有做条件判断,if (str.length & 2)。
级别: 新手上路
可可豆: 30 CB
威望: 29 点
在线时间: 235(时)
发自: Web Page
谢谢,忘了说清楚:arr的长度,是自己发送指令的字符数组,长度大于2, 这句话用上传时候用的是 NSUTF8StringEncoding。 NSString * str = [[NSString alloc]initWithCString:(const char *)arr encoding: NSUTF8StringEncoding];
UID: 38060
发帖: 137580
可可豆: 1373716 CB
威望: 1374133 点
在线时间: 2216(时)
发自: Web Page
你需要把reject的那段话发出来,不然大家看不到为什么被reject也没法帮到你
级别: 新手上路
可可豆: 18 CB
威望: 17 点
在线时间: 20(时)
发自: Web Page
话说, arr里面要是用中文。 你后面这些都不成立了....
假设arr是中文 &NSString *str 就是null
len怎么会有长度....&substringToIndex怎么能len-2
我也只是猜测为什么这句会reject.&
级别: 新手上路
可可豆: 30 CB
威望: 29 点
在线时间: 235(时)
发自: Web Page
没有中文,arr是由一个字符串通过逐个字符加密得到的字符数组NSString * s = @&search
&;for(int i = 0;i&s.i++)
tmp = [s characterAtIndex:i];
arr = DeEnCode(tmp, 0);
}NSString * str = [[NSString alloc]initWithCString:(const char
级别: 新手上路
可可豆: 18 CB
威望: 17 点
在线时间: 20(时)
发自: Web Page
那不知道了,保不齐就是在审核的时候他们测试恰好碰到了str.length & 2的情况......反正不管是编码还是什么其他的。 最后导致被拒一定是跟此时str长度有关系....
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版iOS Base64转码(使用ios7系统自带编码库 和 GMTBase64 两种方式)
demo下载地址:/s/1i3LvaDZ
在iOS7 中提供了base64 的转码方式
示例如下:
NSData* originData = [originStr
dataUsingEncoding:NSASCIIStringEncoding];
NSString* encodeResult = [originData
base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
NSLog(@"encodeResult:%@",encodeResult);
NSData* decodeData = [[NSData
alloc] initWithBase64EncodedString:encodeResult
options:0];
NSString* decodeStr = [[NSString
alloc] initWithData:decodeData
encoding:NSASCIIStringEncoding];
iOS 使用开源库 GTMBase64 转码
-(void)GTMEncodeTest
NSString* originStr =
NSString* encodeResult =
NSData* originData = [originStr
dataUsingEncoding:NSUTF8StringEncoding];
NSData* encodeData = [GTMBase64
encodeData:originData];
encodeResult = [[NSString
alloc] initWithData:encodeData
encoding:NSUTF8StringEncoding];
NSLog(@"%@",encodeResult);
* GTM 解码
-(void)GMTDecodeTest
NSString* encodeStr =
NSString* decodeResult =
NSData* encodeData = [encodeStr
dataUsingEncoding:NSUTF8StringEncoding];
NSData* decodeData = [GTMBase64
decodeData:encodeData];
decodeResult = [[NSString
alloc] initWithData:decodeData
encoding:NSUTF8StringEncoding];
NSLog(@"%@",decodeResult);}

我要回帖

更多关于 万分感谢 英文 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信