当前位置 : 主页 > 编程语言 > c语言 >

C语言函数大全-- x 开头的函数(2)

来源:互联网 收集:自由互联 发布时间:2023-09-03
C语言函数大全 本篇介绍C语言函数大全-- x 开头的函数 1. xdr_char 1.1 函数说明 函数声明 函数功能 bool_t xdr_char(XDR *xdrs, char *cp); 用于将一个 char 类型的数据编码为 XDR 流或从 XDR 流中解码出

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"age18
  • 再然后,调用 xdr_struct() 函数将上述的结构体数据编码到 XDR 流中。在编码完成后,调用 xdr_free() 函数释放已分配的内存空间,以便在序列化过程中使用了动态分配的内存空间得到释放。
  • 再接着,我们将 XDR 流重置为解码模式;
  • 再然后,使用 xdr_struct() 函数从流中读取并解码数据。如果解码成功,则将结果存储在一个名为 resultPerson 结构体中。在解码完成后,我们使用 xdr_free() 函数释放动态分配的内存空间。
  • 最后,输出 Person 结构体中的 nameage 字段值。

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 类型的值。
上一篇:实现堆,堆排序,解决堆的TOPK问题
下一篇:没有了
网友评论