nginx中关于字符串的数据结构位于src/core/ngx_string.c和src/core/ngx_string.h中

先来看一下数据结构:

 typedef struct {
size_t len;
u_char *data;
} ngx_str_t;

data指针指向字符串起始地址,len表示字符串的有效长度。这里面的data并不保证以'\0'结尾,所以必须配合len去使用,否则极其容易造成缓冲区溢出。另外,不保证以'\0'也就说明它是二进制安全的。

下面看一下比较简单的一些函数,都是用宏对C语言中字符串的库函数做了一层封装而已。

Nginx 字符串的初始化使用 ngx_string 或 ngx_null_string ,这两个宏定义如下:

 #define ngx_string(str) {sizeof(str)-1, (u_char *) str}
#define ngx_null_string {0, NULL}

若已经定义了 Nginx 字符串变量之后再赋值,则必须使用 ngx_str_set, ngx_str_null 宏定义:

 #define ngx_str_set(str, text)
(str)->len = sizeof(text)-; (str)->data = (u_char *)text #define ngx_str_null(str) (str)->len = 0; (str)->data = NULL

以下是例子:

 /* 例如:*/
/* 正确写法*/
ngx_str_t str1 = ngx_string("hello nginx");
ngx_str_t str2 = ngx_null_string; /* 错误写法*/
ngx_str_t str1, str2;
str1 = ngx_string("hello nginx"); /* 编译出错 */
str2 = ngx_null_string; /* 编译出错 */ /* 正确写法*/
ngx_str_t str1, str2;
ngx_str_set(&str1, "hello nginx");
ngx_str_null(&str2);
/* 注意:ngx_string 和 ngx_str_set 字符串参数必须是常量字符串,不能是变量字符串 */
1 #define ngx_strncmp(s1, s2, n)  strncmp((const char *) s1, (const char *) s2, n)
 #define ngx_strcmp(s1, s2)  strcmp((const char *) s1, (const char *) s2)
 #define ngx_strstr(s1, s2)  strstr((const char *) s1, (const char *) s2)
 #define ngx_strlen(s)       strlen((const char *) s)
 #define ngx_strchr(s1, c)   strchr((const char *) s1, (int) c)
 #define ngx_memzero(buf, n)       (void) memset(buf, 0, n)
#define ngx_memset(buf, c, n) (void) memset(buf, c, n)
 #define ngx_memcpy(dst, src, n)   (void) memcpy(dst, src, n)
#define ngx_cpymem(dst, src, n) (((u_char *) memcpy(dst, src, n)) + (n))
 #define ngx_memmove(dst, src, n)   (void) memmove(dst, src, n)
#define ngx_movemem(dst, src, n) (((u_char *) memmove(dst, src, n)) + (n))
 #define ngx_memcmp(s1, s2, n)  memcmp((const char *) s1, (const char *) s2, n)

这些函数都没有什么好解释的。

转换大小写的函数:

 #define ngx_tolower(c)      (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)
#define ngx_toupper(c) (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)

这里非常巧妙,就是对第6位进行处理,大小写字母的差是32,而0x20对应32。

还有一些需要再补充……

最新文章

  1. 6-04使用SQL语句更新数据
  2. spring 第一篇(1-1):让java开发变得更简单(下)
  3. mssql 动态添加数据库用户
  4. Java图片处理(一)图片合成
  5. Linux 的启动流程
  6. oracle学习笔记1:windows下oracle数据库安装及.net调用oracle数据库
  7. [转] Python特殊语法:filter、map、reduce、lambda
  8. android 实现代码关机
  9. Android项目包装apk和apk反编译,xml反编译
  10. PB程序源码文件结构 pbl文件 pbd文件
  11. Windows环境部署并调试pyspark(一)
  12. Java常用排序算法
  13. Linux挖矿病毒 khugepageds详细解决步骤
  14. 设计模式之装饰者模式-java实例
  15. map put值 使用匿名函数
  16. Docker Compose 创建yml 简单试例
  17. 点赞和吐糟Adblock Plus~进阶教程
  18. SBT树
  19. Python函数-abs()
  20. java Vamei快速教程05 实施接口

热门文章

  1. 【博弈论】【SG函数】bzoj3404 [Usaco2009 Open]Cow Digit Game又见数字游戏
  2. c pvr转存pvr.ccz格式 (转 http://www.cnblogs.com/howeho/p/3586379.html)
  3. codevs 4163 求逆序对的数目 -树状数组法
  4. 使用FluentValidation来进行数据有效性验证
  5. 根文件系统及Busybox简介
  6. Intellij IDEA错误识别.xml文件
  7. git fetch 的简单用法:更新远程代码到本地仓库及冲突处理
  8. [TypeScript] Use the JavaScript “in” operator for automatic type inference in TypeScript
  9. Java定时任务的三种实现方法
  10. null和undefined相等比较