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
类型的值。