C语言函数大全
本篇介绍C语言函数大全-- x 开头的函数
1. xdr_char
1.1 函数说明
函数声明 | 函数功能 |
---|---|
bool_t xdr_char(XDR *xdrs, char *cp); | 用于将一个 char 类型的数据编码为 XDR 流或从 XDR 流中解码出一个 char 类型的数据 |
参数:
- xdrs : 指向要编码或解码数据的 XDR 结构体的指针
- cp : 指向要编码或解码的 char 类型数据的指针
返回值:
- 如果编码或解码成功,则返回值为
TRUE
;- 否则返回值为
FALSE
。
1.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>int main()
{// 创建 XDR 流XDR xdr;xdrmem_create(&xdr, NULL, 0, XDR_ENCODE); // 写入 char 值char c = 'A';if (!xdr_char(&xdr, &c)) {printf("写入失败");return 1;}// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 从流中读取 char 值char result;if (!xdr_char(&xdr, &result)) {printf("读取失败");return 1;}// 输出结果printf("读取结果:%c\n", result);return 0;
}
在上面的示例代码中,
- 首先,我们调用
xdrmem_create()
函数创建了一个XDR
流; - 然后,使用
xdr_char()
函数将char
值写入流中; - 接着,通过调用
xdrrec_endofrecord()
函数将流重置为解码模式; - 再接着,使用
xdr_char()
函数从流中读取char
值; - 最后,输出从流中读取的
char
值。
2. xdr_callmsg
2.1 函数说明
函数声明 | 函数功能 |
---|---|
bool_t xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg); | 用于将表示 RPC 消息的结构体编码为 XDR 流或从 XDR 流中解码出一个表示 RPC 消息的结构体 |
参数:
- xdrs : 指向要编码或解码数据的
XDR
结构体的指针- cmsg : 指向表示
RPC
消息的结构体的指针
返回值:
- 如果编码或解码成功,则返回值为
TRUE
;- 否则返回值为
FALSE
。
2.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>
#include <rpc/rpc.h>int main()
{// 创建一个表示 RPC 消息的结构体struct rpc_msg cmsg = {.rm_xid = 1234567890,.rm_direction = CALL,.rm_call.cb_rpcvers = 2,.rm_call.cb_prog = 100001,.rm_call.cb_vers = 1,.rm_call.cb_proc = 4};// 创建 XDR 流XDR xdr;char buffer[1024];xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE);// 将消息编码到 XDR 流中if (!xdr_callmsg(&xdr, &cmsg)) {printf("编码失败");return 1;}// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 从流中读取消息struct rpc_msg result;if (!xdr_callmsg(&xdr, &result)) {printf("解码失败");return 1;}// 输出结果printf("读取结果:\n");printf(" XID: %u\n", result.rm_xid);printf(" Direction: %d\n", result.rm_direction);printf(" RPC Version: %u\n", result.rm_call.cb_rpcvers);printf(" Program: %u\n", result.rm_call.cb_prog);printf(" Program Version: %u\n", result.rm_call.cb_vers);printf(" Procedure: %u\n", result.rm_call.cb_proc);return 0;
}
在上面的这个示例中,
- 首先,我们定义了一个表示
RPC
消息的结构体cmsg
,其中包含 消息的 XID、方向、RPC 版本号、程序号、程序版本号 和 过程号 等字段。 - 接着,使用
xdrmem_create()
函数创建一个内存XDR
流,用于将消息编码为XDR
格式; - 然后,调用
xdr_callmsg()
函数将消息编码到XDR
流中。如果编码成功,则返回值为TRUE
,否则返回值为FALSE
。 - 再接着,调用
xdrrec_endofrecord()
函数将流重置为解码模式,以便从流中读取已编码的消息。 - 再然后,再次调用
xdr_callmsg()
函数从流中解码出一个表示RPC
消息的结构体,并将其保存在result
变量中。 - 最后,使用
printf()
函数输出解码后的消息字段。
3. xdr_double
3.1 函数说明
函数声明 | 函数功能 |
---|---|
bool_t xdr_authunix_parms(XDR *xdrs, struct authunix_parms *objp); | 用于将 double 类型数据编码为 XDR 流或从 XDR 流中解码出一个 double 类型数据 |
参数:
- xdrs : 指向要编码或解码数据的
XDR
结构体的指针- dp : 指向要编码或解码的
double
类型数据的指针
返回值:
- 如果编码或解码成功,则返回值为
TRUE
;- 否则返回值为
FALSE
。
3.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>int main()
{// 创建 XDR 流XDR xdr;char buffer[1024];xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE);// 写入 double 值double d = 3.1415926;if (!xdr_double(&xdr, &d)) {printf("写入失败");return 1;}// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 从流中读取 double 值double result;if (!xdr_double(&xdr, &result)) {printf("读取失败");return 1;}// 输出结果printf("读取结果:%f\n", result);return 0;
}
在上面的示例代码中,
- 首先,我们调用
xdrmem_create()
函数创建了一个XDR
流; - 然后,使用
xdr_double()
函数将double
值写入流中; - 接着,通过调用
xdrrec_endofrecord()
函数将流重置为解码模式; - 再接着,使用
xdr_double()
函数从流中读取double
值; - 最后,输出从流中读取的
double
值。
注意: 由于不同的系统架构和字节序可能会影响浮点数的表示方式,因此在使用
xdr_double
函数时必须格外小心。建议在使用此函数时仅在相同的系统和语言之间进行传输。
4. xdr_enum
4.1 函数说明
函数声明 | 函数功能 |
---|---|
bool_t xdr_enum(XDR *xdrs, enum_t *ep); | 用于将 枚举类型数据编码为 XDR 流或从 XDR 流中解码出枚举类型数据 |
参数:
- xdrs : 指向要编码或解码数据的
XDR
结构体的指针- ep : 指向要编码或解码的枚举类型数据的指针
返回值:
- 如果编码或解码成功,则返回值为
TRUE
;- 否则返回值为
FALSE
。
4.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>enum Color
{RED,GREEN,BLUE
};int main()
{// 创建 XDR 流XDR xdr;char buffer[1024];xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE); // 写入枚举类型值enum Color c = GREEN;if (!xdr_enum(&xdr, (enum_t *)&c)) {printf("写入失败");return 1;}// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 从流中读取枚举类型值enum Color result;if (!xdr_enum(&xdr, (enum_t *)&result)) {printf("读取失败");return 1;}// 输出结果printf("读取结果:%d\n", result);return 0;
}
在上面的这个示例程序中,
- 首先,我们调用
xdrmem_create()
函数创建了一个XDR
流; - 然后,使用
xdr_enum()
函数将 枚举类型值GREEN
写入流中; - 接着,调用
xdrrec_endofrecord()
函数将流重置为解码模式; - 再接着,使用
xdr_enum()
函数从流中读取枚举类型值; - 最后,调用
printf()
函数输出从流中读取的布尔值。
5. xdr_float
5.1 函数说明
函数声明 | 函数功能 |
---|---|
bool_t xdr_float(XDR *xdrs, float *fp); | 用于将 float 类型数据编码为 XDR 流或从 XDR 流中解码出一个 float 类型数据 |
参数:
- xdrs : 指向要编码或解码数据的
XDR
结构体的指针- fp : 指向要编码或解码的
float
类型数据的指针
返回值:
- 如果编码或解码成功,则返回值为
TRUE
;- 否则返回值为
FALSE
。
5.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>int main()
{// 创建 XDR 流XDR xdr;char buffer[1024];xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE);// 写入 float 值float f = 3.14;if (!xdr_float(&xdr, &f)) {printf("写入失败");return 1;}// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 从流中读取 float 值float result;if (!xdr_float(&xdr, &result)) {printf("读取失败");return 1;}// 输出结果printf("读取结果:%f\n", result);return 0;
}
在上面的示例代码中,
- 首先,我们调用
xdrmem_create()
函数创建了一个XDR
流; - 然后,使用
xdr_float()
函数将float
值写入流中; - 接着,通过调用
xdrrec_endofrecord()
函数将流重置为解码模式; - 再接着,使用
xdr_float()
函数从流中读取float
值; - 最后,输出从流中读取的
float
值。
6. xdr_free
6.1 函数说明
函数声明 | 函数功能 |
---|---|
void xdr_free(xdrproc_t proc, char* objp); | 用于释放由 xdr 系列函数分配的动态内存空间 |
参数:
- proc : 序列化或反序列化对象的指针类型
- objp : 需要释放的动态分配内存的指针
6.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>struct Person {char *name;int age;
};int main()
{// 创建 XDR 流XDR xdr;char buffer[1024];xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE);// 分配内存并编码数据到 XDR 流中struct Person *p = (struct Person *)xdr_malloc(&xdr, sizeof(struct Person));p->name = "Huazie";p->age = 18;xdr_struct(&xdr, "Person", (xdrproc_t)xdr_person, (char *)p);xdr_free((xdrproc_t)xdr_person, (char *)p);// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 解码数据并释放内存struct Person result;if (xdr_struct(&xdr, "Person", (xdrproc_t)xdr_person, (char *)&result)) {printf("读取结果:name = %s, age = %d\n", result.name, result.age);xdr_free((xdrproc_t)xdr_person, (char *)&result);}else {printf("读取失败");}return 0;
}// 编码和解码 Person 类型数据
bool_t xdr_person(XDR *xdrs, struct Person *p)
{return xdr_string(xdrs, &p->name, ~0) && xdr_int(xdrs, &p->age);
}
在上面的示例代码中,
- 首先,定义了一个名为
Person
的结构体,其中包含了一个字符串类型的name
字段和一个整数类型的age
字段; - 然后,我们使用
xdrmem_create()
函数创建了一个XDR
流,并将其绑定到buffer
缓冲区上; - 接着,我们调用
xdr_malloc()
函数分配了一个结构体Person
的内存空间,分别赋值name
为"Huazie"
,age
为18
; - 再然后,调用
xdr_struct()
函数将上述的结构体数据编码到XDR
流中。在编码完成后,调用xdr_free()
函数释放已分配的内存空间,以便在序列化过程中使用了动态分配的内存空间得到释放。 - 再接着,我们将
XDR
流重置为解码模式; - 再然后,使用
xdr_struct()
函数从流中读取并解码数据。如果解码成功,则将结果存储在一个名为result
的Person
结构体中。在解码完成后,我们使用xdr_free()
函数释放动态分配的内存空间。 - 最后,输出
Person
结构体中的name
和age
字段值。
7. xdr_hyper
7.1 函数说明
函数声明 | 函数功能 |
---|---|
bool_t xdr_hyper(XDR *xdrs, hyper *hp); | 用于编码和解码超长整数类型的数据 |
参数:
- xdrs : 指向要编码或解码数据的
XDR
结构体的指针- hp : 指向要编码或解码的超长整数类型的指针
返回值:
- 如果编码或解码成功,则返回值为
TRUE
;- 否则返回值为
FALSE
。
7.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>int main()
{// 创建 XDR 流XDR xdr;char buffer[1024];xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE);// 编码超长整数类型的数据hyper h = 1234567890123456789;if (xdr_hyper(&xdr, &h)) {printf("编码成功\n");}// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 解码超长整数类型的数据hyper result;if (xdr_hyper(&xdr, &result)) {printf("解码成功,result = %lld\n", result);}return 0;
}
在上面的示例代码中,
- 首先,我们使用
xdrmem_create()
函数创建了一个XDR
流,并将其绑定到buffer
缓冲区上; - 然后,定义了一个超长整数类型的变量
h
,并将其赋值为1234567890123456789
; - 接着,使用
xdr_hyper()
函数将超长整数类型的数据编码到XDR
流中,并检查编码是否成功;如果编码成功,则输出"编码成功"
; - 再接着,调用
xdrrec_endofrecord()
函数将XDR
流重置为解码模式; - 最后, 调用
xdr_hyper()
函数将从XDR
流中读出的数据解码为超长整数类型,并检查解码是否成功;如果解码成功,则输出解码结果。
8. xdr_int
8.1 函数说明
函数声明 | 函数功能 |
---|---|
bool_t xdr_int(XDR *xdrs, int *ip); | 用于将 int 类型数据编码为 XDR 流或从 XDR 流中解码出一个 int 类型数据 |
参数:
参数:
- xdrs : 指向要编码或解码数据的
XDR
结构体的指针- ip : 指向要编码或解码的
int
类型数据的指针
返回值:
- 如果编码或解码成功,则返回值为
TRUE
;- 否则返回值为
FALSE
。
8.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>int main()
{// 创建 XDR 流XDR xdr;char buffer[1024];xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE);// 编码整数类型的数据int i = 12345;if (xdr_int(&xdr, &i)) {printf("编码成功\n");}// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 解码整数类型的数据int result;if (xdr_int(&xdr, &result)) {printf("解码成功,result = %d\n", result);}return 0;
}
在上面的示例代码中,
- 首先,我们调用
xdrmem_create()
函数创建了一个XDR
流; - 然后,使用
xdr_int()
函数将int
类型的值12345
写入流中;如果返回TRUE
,则说明编码成功,输出”编码成功“
; - 接着,通过调用
xdrrec_endofrecord()
函数将流重置为解码模式; - 最后,使用
xdr_int()
函数从流中读取int
类型的值;如果返回 TRUE,则说明解码成功,输出从流中读取的int
类型的值。
9. xdr_long
9.1 函数说明
函数声明 | 函数功能 |
---|---|
bool_t xdr_long(XDR *xdrs, long *lp); | 用于将 long 类型数据编码为 XDR 流或从 XDR 流中解码出一个 long 类型数据 |
参数:
- xdrs : 指向要编码或解码数据的
XDR
结构体的指针- lp : 指向要编码或解码的
long
类型数据的指针
返回值:
- 如果编码或解码成功,则返回值为
TRUE
;- 否则返回值为
FALSE
。
9.2 演示示例
#include <stdio.h>
#include <rpc/xdr.h>int main()
{// 创建 XDR 流XDR xdr;char buffer[1024];xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE);// 编码长整数类型的数据long l = 1234567890;if (xdr_long(&xdr, &l)) {printf("编码成功\n");}// 重置 XDR 流为解码模式xdrrec_endofrecord(&xdr, true);// 解码长整数类型的数据long result;if (xdr_long(&xdr, &result)) {printf("解码成功,result = %ld\n", result);}return 0;
}
在上面的示例代码中,
- 首先,我们调用
xdrmem_create()
函数创建了一个XDR
流; - 然后,使用
xdr_long()
函数将long
类型的值1234567890
写入流中;如果返回TRUE
,则说明编码成功,输出”编码成功“
; - 接着,调用
xdrrec_endofrecord()
函数将流重置为解码模式; - 最后,使用
xdr_long()
函数从流中读取long
类型的值;如果返回 TRUE,则说明解码成功,输出从流中读取的long
类型的值。