百度api图像识别用到的base64编码和urlencode编码

本文涉及的产品
图像搜索,7款服务类型 1个月
简介: 百度api图像识别用到的base64编码和urlencode编码
// 需要自己开辟空间
const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int hex2dec(char c)
{
    if ('0' <= c && c <= '9') 
    {
        return c - '0';
    } 
    else if ('a' <= c && c <= 'f')
    {
        return c - 'a' + 10;
    } 
    else if ('A' <= c && c <= 'F')
    {
        return c - 'A' + 10;
    } 
    else 
    {
        return -1;
    }
}
char dec2hex(short int c)
{
    if (0 <= c && c <= 9) 
    {
        return c + '0';
    } 
    else if (10 <= c && c <= 15) 
    {
        return c + 'A' - 10;
    } 
    else 
    {
        return -1;
    }
}
//urldecode编码 
/*
    dest: 编码好的数据放在这里
    src: 待编码的数据
    dest <----- src
*/
void urlencode(char *dest, char *src)
{
    int i = 0;
    int len = strlen(src);
    int res_len = 0;
    for (i = 0; i < len; ++i) 
    {
        char c = src[i];
        if (    ('0' <= c && c <= '9') ||
                ('a' <= c && c <= 'z') ||
                ('A' <= c && c <= 'Z') || 
                c == '/' || c == '.') 
        {
            dest[res_len++] = c;
        } 
        else 
        {
            int j = (short int)c;
            if (j < 0)
                j += 256;
            int i1, i0;
            i1 = j / 16;
            i0 = j - i1 * 16;
            dest[res_len++] = '%';
            dest[res_len++] = dec2hex(i1);
            dest[res_len++] = dec2hex(i0);
        }
    }
    dest[res_len] = '\0';
}
//urlencode解码
/*
    dest: 解码好的数据放在这里
    src: 待解码的数据
    dest <----- src
*/
void urldecode(char *dest, char *src)
{
    int i = 0;
    int len = strlen(src);
    int res_len = 0;
    for (i = 0; i < len; ++i) 
    {
        char c = src[i];
        if (c != '%') 
        {
            dest[res_len++] = c;
        }
        else 
        {
            char c1 = src[++i];
            char c0 = src[++i];
            int num = 0;
            num = hex2dec(c1) * 16 + hex2dec(c0);
            dest[res_len++] = num;
        }
    }
    dest[res_len] = '\0';
}
 // base64编码
 /*
    bindta: 原数据
    base64: 转换成base64的数据
    binlength: 原数据长度
 */
void base64_encode(char * base64, const unsigned char * bindata, int binlength)
{
    int i, j;
    unsigned char current;
    for ( i = 0, j = 0 ; i < binlength ; i += 3 )
    {
        current = (bindata[i] >> 2) ;
        current &= (unsigned char)0x3F;
        base64[j++] = base64char[(int)current];
        current = ( (unsigned char)(bindata[i] << 4 ) ) & ( (unsigned char)0x30 ) ;
        if ( i + 1 >= binlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            base64[j++] = '=';
            break;
        }
        current |= ( (unsigned char)(bindata[i+1] >> 4) ) & ( (unsigned char) 0x0F );
        base64[j++] = base64char[(int)current];
        current = ( (unsigned char)(bindata[i+1] << 2) ) & ( (unsigned char)0x3C ) ;
        if ( i + 2 >= binlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            break;
        }
        current |= ( (unsigned char)(bindata[i+2] >> 6) ) & ( (unsigned char) 0x03 );
        base64[j++] = base64char[(int)current];
        current = ( (unsigned char)bindata[i+2] ) & ( (unsigned char)0x3F ) ;
        base64[j++] = base64char[(int)current];
    }
    base64[j] = '\0';
    // printf("base_data: %s", base64);
}
 // base64解码
 /*
    base64: 原base64数据
    bindta: 解码后的的数据
 */
int base64_decode(unsigned char * bindata, const char * base64)
{
    int i, j;
    unsigned char k;
    unsigned char temp[4];
    for ( i = 0, j = 0; base64[i] != '\0' ; i += 4 )
    {
        memset( temp, 0xFF, sizeof(temp) );
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i] )
                temp[0]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+1] )
                temp[1]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+2] )
                temp[2]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+3] )
                temp[3]= k;
        }
        bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
                ((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
        if ( base64[i+2] == '=' )
            break;
        bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
                ((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
        if ( base64[i+3] == '=' )
            break;
        bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
                ((unsigned char)(temp[3]&0x3F));
    }
    return j;
}
目录
相关文章
|
4月前
|
开发框架 前端开发 API
使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理
使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理
|
7月前
|
安全 Java Unix
|
编解码 JavaScript 前端开发
百度地图:使用javascript和web服务API自动实现经纬度编码的解决方案
百度地图:使用javascript和web服务API自动实现经纬度编码的解决方案
142 1
|
SQL 存储 分布式计算
【Java新特性学习 四】JDK8: 库函数新特性之Optional,Streams,Date/Time API(JSR 310),Base64,并行数组
【Java新特性学习 四】JDK8: 库函数新特性之Optional,Streams,Date/Time API(JSR 310),Base64,并行数组
81 0
|
前端开发 JavaScript API
几种不常用Web API(振动、重力感应、联网状态、系统电量信息、页面可见性、canvas转base64、监听屏幕旋转、元素全屏显示)
navigator对象中有一些不常用的API,以下主要介绍vibrate振动,deviceorientation重力感应,online联网状态,getBattery系统电量信息,visibilitychange页面可见性,toDataURL(canvas转base64),orientationchange监听屏幕旋转和fullScreen元素全屏显示。
几种不常用Web API(振动、重力感应、联网状态、系统电量信息、页面可见性、canvas转base64、监听屏幕旋转、元素全屏显示)
|
TensorFlow API 算法框架/工具
TensorFlow利用函数API实现简易自编码器
TensorFlow利用函数API实现简易自编码器
70 0
TensorFlow利用函数API实现简易自编码器
|
安全 Java API
java安全编码指南之:Thread API调用规则
java安全编码指南之:Thread API调用规则
|
Web App开发 Java 测试技术
利用Java编码测试CSRF令牌验证的Web API
前一篇拙文是利用了Jmeter来测试带有CSRF令牌验证的Web API;最近几天趁着项目不忙,练习了用编码的方式实现。 有了之前Jmeter脚本的基础,基本上难点也就在两个地方:获取CSRF令牌、Cookie的传递。
1176 0
|
前端开发 JavaScript .NET
【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据
原文:【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据 注:本文是【ASP.NET Web API系列教程】的一部分,如果您是第一次看本系列教程,请先看前面的内容。
1203 0