首页 > 其他分享 >C语言函数大全-- x 开头的函数(2)

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

时间:2023-05-22 21:32:56浏览次数:40  
标签:result 编码 函数 -- 解码 C语言 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 类型的值。

标签:result,编码,函数,--,解码,C语言,XDR,xdr
From: https://blog.51cto.com/huazie/6327123

相关文章

  • 浪莎袜业2023年代言人官宣,郎朗吉娜造型亮眼!
    郎朗自2023年2月开启全球巡演以来,全球各地售罄消息络绎不绝,情人节当天,在纽约无线电城音乐大厅带来了《郎朗的迪士尼》专场音乐会,值得一提的是,此次演出也是纽约无线电音乐大厅首次举办古典钢琴专场音乐会,音乐厅6000余位座无虚席。而作为东北媳妇的吉娜是本季《浪姐4》节目中年纪最......
  • 首次代言家居服饰品牌,郎朗官宣成为浪莎全球形象代言人
    近日,浪莎品牌迎来再次升级,官方宣布国际钢琴大师郎朗成为其全球形象代言人。作为中国钢琴家中的佼佼者,郎朗以其深厚的艺术造诣和卓越的音乐天赋,成为国际音乐界备受瞩目的明星。而此次与浪莎合作,也为其音乐之路添上了一笔新的光彩。郎朗作为国内外知名的钢琴家和音乐家,其出色的技艺和......
  • Java-Servlet解析
    前言从事Javaweb项目开发有一段时间了,一直不理解它是怎么一回事,后来查询资料发现这里面涉及到几个东西,分别是tomcat、JavaEE中13个规范之一的servlet、以及springMVC。于是就去学习了一下,发现这里里面都是围绕这servlet进行的操作。于是就有了今天的这个总结。Servlet定义Servl......
  • FL Studio21教程之如何插入第三方插件
    FLStudio21是一款非常容易上手同时又特别强大的编曲软件,FLStudio21拥有一些内置插件,如Soundgoodizer,也可以插入第三方插件。本文将介绍在FLStudio21使用过程中如何插入第三方插件的方法过程,感兴趣的一定要关注哦。首先,打开FLStudio21软件,在通道列表中任意选择一个通道,右击,......
  • Airflow 设置Task优先级
    Airflow要设置Task的优先级,涉及到这2个配置1.weight_rule2.priority_weightweight_rule默认是downstream。还有其他2个配置upstream和absolutepriority_weight默认是1比如,下面的DAG1.weight_rule=downstreamtask优先级start5x12x22y11y212.weight_rule=upstreamtask优先级start1x12......
  • 2023.5.22——软件工程日报
    所花时间(包括上课):6h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习。我了解到的知识点:1.了解了一些数据库的知识;2.了解了一些python的知识;3.了解了一些英语知识;5.了解了一些Javaweb的知识;4.了解了一些数学建模的知识;6.了解了一些计算机网络的知识;......
  • libtorch教程(三)简单模型搭建
    前言 模块化编程的思想非常重要,通过模块化编程可以大幅减少重复的敲代码过程,同时代码可读性也会增加。本章将讲述如何使用libtorch搭建一些MLP和CNN的基本模块。本教程禁止转载。同时,本教程来自知识星球【CV技术指南】更多技术教程,可加入星球学习。欢迎关注公众号CV技术指南,专......
  • swagger的搭建以及访问
    ##访问地址http://localhost:9200/swagger-ui.html###环境搭建springboot的启动类上添加 @EnableSwagger2//用于开启Swagger@SpringBootApplication@EnableSwagger2//用于开启SwaggerpublicclassDemoApplication{publicstaticvoidmain(String[]args){......
  • 复杂链表的复制
       ......
  • drf自动生产路由
    自动生产路由#ReadOnlyModelViewSet:两个接口,list和retrievefromrest_framework.viewsetsimportReadOnlyModelViewSetclassBookLIstretrieveView(ReadOnlyModelViewSet):queryset=Book.objects.all()serializer_class=Bookserializers#ViewSetMixin:魔......