环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字)。

应用:有了它,服务器后台程序就可以获取前端请求的数据信息。

头文件

 /* 这是一份关于从Http请求信息中提取键值的接口声明文件 */
#ifndef _URIDecode_H_
#define _URIDecode_H_
#include "status.h"
/*
* 相关数据类型
*/
typedef unsigned char uChar; /*
* 获取指定键的键值
*
* queryStr -- 请求信息的字符串
* keyName -- 指定的键名
* resultp -- (用指针)返回键值
* 返回值,如果操作成功返回OK;否则返回ERROR。 注意的是,键名不存在的话,键值返回NULL。
*/
STATUS
GetTheKeyValue(char const *queryStr, char const *keyName, uChar **resultp);
#endif

URIDecode.h

接口定义

 /* 这是一份描述从Http请求信息中提取有效键值的接口定义文件 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "URIDecode.h"
#include "status.h" /*
* 内部接口
*
*
* 统计键值包含的字节数目。
*
* keyValue -- 指定的键值
* 返回值,返回统计的结果。
*/
static int
GetItsSize(char const *keyValue)
{
char const *p = NULL;
char ch;
int counter = ; if(keyValue == NULL) //检查参数是否有效
{
fprintf(stdout, "传递给函数GetItsSize的参数keyValue无效。\n");
return -;
} for(p = keyValue; (ch = *p) != '\0'; p ++) //统计键值的长度
{
if(ch == '&') //表示键值结束
{
break;
}
if(ch == '%')
{
p += ;
}
counter ++;
}
return counter;
} /*
* 把两位16进制转换为10进制,并返回结果。
*
* digit1 -- 第一位16进制
* digit2 -- 第二位16进制
* 返回值,返回结果(返回类型是无符号整型)。
*/
static uChar
MergeThem(char digit1, char digit2)
{
uChar result;
int v1,v2; v1 = (digit1 <= 'Z' && digit1 >= 'A')? digit1 - 'A' + : digit1 - '';
v2 = (digit2 <= 'Z' && digit2 >= 'A')? digit2 - 'A' + : digit2 - '';
result = v1 * + v2;
return result;
} /*
* 外部接口
*
*
* 获取指定键的键值。
*
* queryStr -- 请求信息的字符串
* keyName -- 指定的键名
* resultp -- (用指针)返回键值
* 返回值,如果操作成功返回OK;否则返回ERROR。
*/
STATUS
GetTheKeyValue(char const *queryStr, char const *keyName, uChar **resultp)
{
uChar *result = NULL; //存放键值
char const *p = NULL;
char ch;
int keyValueSize;
int i = ; if(queryStr == NULL) //检查参数是否有效
{
fprintf(stdout, "传递给函数GetTheKeyValue的参数queryStr无效。\n");
return ERROR;
}
if(keyName == NULL)
{
fprintf(stdout, "传递给函数GetTheKeyValue的参数keyName无效。\n");
return ERROR;
}
if(resultp == NULL)
{
fprintf(stdout, "传递给函数GetTheKeyValue的参数resultp无效。\n");
return ERROR;
} p = strstr(queryStr, keyName); //找到键值起始位置
if(p == NULL) //如果指定的键名不存在
{
*resultp = result; //键值返回NULL
return OK;
} p = strchr(p, '=');
keyValueSize = GetItsSize(++ p); result = (uChar *)malloc((keyValueSize + ) * sizeof(uChar)); //申请一段内存来存放键值
if(result == NULL)
{
fprintf(stdout, "内存不足。\n");
exit(EXIT_FAILURE);
} while((ch = *p) != '\0' && ch != '&') //获取有效键值
{ if(ch == '%')
{
result [i] = MergeThem(p[], p[]);
p += ;
}
else
{
result [i] = (uChar)ch;
p ++;
}
i ++;
}
result [i] = '\0'; //结尾 *resultp = result;
return OK;
}

C语言定义从URL中获取键值的接口的更多相关文章

  1. C#获取url中参数键值对的方法

    方法如下: /// <summary> /// 遍历Url中的参数列表 /// </summary> /// <returns>如:(?userName=keley ...

  2. php中的常用数组函数(五)(数组中获取键名集合)

    array_keys($arr, $search_value, $strict); --数组中获取键名的集合. //参数1 要检索的数组:参数2 要检索的键值 默认NULL: 参数3 是否严格比较(= ...

  3. js使用正则表达式从url中获取参数值

    //从url中获取参数值 function getvl(name) { var reg = new RegExp("(^|\\?|&)"+ name +"=([^ ...

  4. js中以键值对的形式当枚举

    js中以键值对的形式当枚举var Penum= { B: "姓名", C: "所属居委", D: "证件号", E: "性别&qu ...

  5. linux驱动之中断方式获取键值

    linux驱动之中断方式获取键值 ----------------------------------------------------------------------------------- ...

  6. 在C#中用Linq从属性文件中读取键值对Key-Value Pair

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中用Linq从属性文件中读取键值对Key-Value Pair.

  7. PHP如何根据数组中的键值进行排序

    主要是使用PHP的排序函数,asort()和arsort(). 为了减少代码的耦合性,我们将根据数组中的键值进行排序封装成一个函数 <?php $array = array( array(), ...

  8. Redis中的键值过期操作

    1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...

  9. js获取页面url中的各项值

    一. 通过window.location获取各项参数 1.获取页面完整的url url = window.location.href; 2.获取页面的域名 host = window.location ...

随机推荐

  1. https 协议下服务器根据网络地址下载上传文件问题

    https 协议下服务器根据网络地址下载上传文件遇到(PKIX:unable to find valid certification path to requested target 的问题) 使用h ...

  2. 深入浅出数据结构C语言版(17)——有关排序算法的分析

    这一篇博文我们将讨论一些与排序算法有关的定理,这些定理将解释插入排序博文中提出的疑问(为什么冒泡排序与插入排序总是执行同样数量的交换操作,而选择排序不一定),同时为讲述高级排序算法做铺垫(高级排序为什 ...

  3. Spring中ApplicationContextAware的用法

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt379 一.这个接口有什么用? 当一个类实现了这个接口(Application ...

  4. LINUX下C语言编程调用函数、链接头文件以及库文件

    LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...

  5. IOS学习【xcode 7新特性url链接】

    由于xcode7的更新,在访问http链接的时候会输出错误信息 The resource could not be loaded because the App Transport Security ...

  6. python 从视频中提取图片,并保存在硬盘上

    使用python的moviepy库来提取视频中的图片,按照视频每帧一个图片的方式来保存. extract images from video, than save them to disk from ...

  7. 关于selenium IDE找不到元素

    selenium IDE ,明明存在元素,却找不到元素 ,报错Element not found 标签: seleniumselenium IDE自动化测试ide 2016-10-31 13:25 1 ...

  8. 团队作业八——第二次团队冲刺(Beta版本)第3天

    一.每个人的工作 (1) 昨天已完成的工作 对界面进行完善,并增加简单界面(包含简单界面内含的界面),简单模式与复杂模式的选择界面. (2) 今天计划完成的工作 做一下用户注册的功能和登录功能. (3 ...

  9. 201521123077 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 向对象思想总结 1.2 使用常规方法总结其他上课内容 Swing一些常用组件的基本用法 Object类的clone及hashcode方法 2. 书面作业 1. clone方 ...

  10. 201521123003《Java程序设计》第3周学习总结

    1. 本章学习总结 你对于本章知识的学习总结 了解和学会使用更多已有的类,如Calendar类.Math类.Arrays类等等 public.private的权限修饰 学会使用在Eclipse工具栏中 ...