博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx源码学习_数据结构(ngx_str_t)
阅读量:5119 次
发布时间:2019-06-13

本文共 2202 字,大约阅读时间需要 7 分钟。

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

先来看一下数据结构:

1 typedef struct {2     size_t      len;3     u_char     *data;4 } ngx_str_t;

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

 

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

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

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

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

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

以下是例子:

1 /* 例如:*/ 2 /* 正确写法*/ 3 ngx_str_t str1 = ngx_string("hello nginx"); 4 ngx_str_t str2 = ngx_null_string; 5  6 /* 错误写法*/ 7 ngx_str_t str1, str2; 8 str1 = ngx_string("hello nginx");   /* 编译出错 */ 9 str2 = ngx_null_string;             /* 编译出错 */10 11 /* 正确写法*/12 ngx_str_t str1, str2;13 ngx_str_set(&str1, "hello nginx");14 ngx_str_null(&str2);15 /* 注意:ngx_string 和 ngx_str_set 字符串参数必须是常量字符串,不能是变量字符串 */

 

1 #define ngx_strncmp(s1, s2, n)  strncmp((const char *) s1, (const char *) s2, n)
1 #define ngx_strcmp(s1, s2)  strcmp((const char *) s1, (const char *) s2)
1 #define ngx_strstr(s1, s2)  strstr((const char *) s1, (const char *) s2)
1 #define ngx_strlen(s)       strlen((const char *) s)
1 #define ngx_strchr(s1, c)   strchr((const char *) s1, (int) c)
1 #define ngx_memzero(buf, n)       (void) memset(buf, 0, n)2 #define ngx_memset(buf, c, n)     (void) memset(buf, c, n)
1 #define ngx_memcpy(dst, src, n)   (void) memcpy(dst, src, n)2 #define ngx_cpymem(dst, src, n)   (((u_char *) memcpy(dst, src, n)) + (n))
1 #define ngx_memmove(dst, src, n)   (void) memmove(dst, src, n)2 #define ngx_movemem(dst, src, n)   (((u_char *) memmove(dst, src, n)) + (n))
1 #define ngx_memcmp(s1, s2, n)  memcmp((const char *) s1, (const char *) s2, n)

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

 

转换大小写的函数:

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

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

 

还有一些需要再补充……

 

转载于:https://www.cnblogs.com/abc-begin/p/7543184.html

你可能感兴趣的文章
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
嵌入式成长轨迹52 【Zigbee项目】【CC2430基础实验】【在PC用串口收数并发数】...
查看>>
函数随笔
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
【实数二分/前缀和维护】Best Cow Fences
查看>>
构造者模式
查看>>
浮点数转化为字符串
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
Linux命令应用大词典-第4章 目录和文件操作
查看>>
A + B Problem II
查看>>
app与服务端通信时如何进行消息校验
查看>>
AS3优化性能笔记二
查看>>
wpf combobox
查看>>
Java高阶回调,回调函数的另一种玩法
查看>>