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

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

时间:2023-05-24 23:31:48浏览次数:37  
标签:编码 函数 -- 解码 C语言 int XDR xdr xdrs

C语言函数大全

本篇介绍C语言函数大全-- x 开头的函数

1. xdr_struct

1.1 函数说明

函数声明 函数功能
bool_t xdr_struct(XDR *xdrs, void *addr, ...); 用于编码或解码结构体数据

参数:

  • xdrs : 指向 XDR 数据结构的指针,表示要进行编码或解码的数据流
  • addr : 指向待编码或解码的结构体变量的指针
  • ... : 任意数量和类型的参数,用于描述结构体的成员以及它们的序列化格式的

返回值:

  • 如果编码或解码成功,则返回值为 TRUE
  • 否则返回值为 FALSE

1.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

struct person 
{
    char name[20];
    int age;
};

int main() 
{
    struct person p1 = {"Huazie", 18};
    struct person p2;

    XDR xdrs;
    char buffer[100];

    // 初始化xdr流
    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_ENCODE);

    // 编码p1结构体
    if (!xdr_struct(&xdrs, "person", (char *)&p1, sizeof(p1))) {
        printf("编码失败\n");
        return -1;
    }

    // 重置xdr流
    xdr_destroy(&xdrs);
    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_DECODE);

    // 解码结构体
    if (!xdr_struct(&xdrs, "person", (char *)&p2, sizeof(p2))) {
        printf("解码失败\n");
        return -1;
    }

    // 输出结果
    printf("p1: name=%s, age=%d\n", p1.name, p1.age);
    printf("p2: name=%s, age=%d\n", p2.name, p2.age);

    return 0;
}

在上面的示例代码中, -首先,我们定义了两个 person 类型的变量 p1p2,其中 p1 被初始化为 {name="Huazie", age=18}

  • 然后,使用 xdrmem_create() 函数创建了一个 xdr 流,将其与一个大小为 100 字节的 buffer 绑定;
  • 接着,使用 xdr_struct() 函数对 p1 结构体进行编码;
  • 再然后,调用 xdr_destroy() 函数重置了xdr 流,并使用 xdrmem_create() 函数将其重新绑定到 buffer 上;
  • 再接着,使用 xdr_struct() 函数将编码后的数据解码到 p2 变量中,并检查是否解码成功。
  • 最后,输出了 p1p2 结构体对应的成员变量的值。

2. xdr_u_char

2.1 函数说明

函数声明 函数功能
bool_t xdr_u_char(XDR *xdrs, u_char *up); 用于编码或解码 unsigned char 类型的值

参数:

  • xdrs : 指向 XDR 结构体的指针
  • up : 指向 unsigned char 类型变量的指针

返回值:

  • 如果编码或解码成功,则返回值为 TRUE
  • 否则返回值为 FALSE

2.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main() 
{
    XDR xdrs;
    u_char val = 'a';
    u_char result;

    char buf[1024];
    xdrmem_create(&xdrs, buf, sizeof(buf), XDR_ENCODE);
    if (!xdr_u_char(&xdrs, &val))
    {
        printf("编码失败!");
        return 1;
    }
    // 获取编码后数据的长度
    int len = xdr_getpos(&xdrs);  

    xdrmem_create(&xdrs, buf, len, XDR_DECODE);
    if (!xdr_u_char(&xdrs, &result)) 
    {
        printf("解码失败!");
        return 1;
    }

    printf("编码前的值:%c\n", val);
    printf("编码后的长度:%d\n", len);
    printf("解码后的值:%c\n", result);
    return 0;
}

在上面的这个示例中,

  • 首先,我们定义了一个 unsigned char 类型的变量 val,并将其初始化为字符 'a'
  • 然后,使用 xdrmem_create() 函数创建了一个 XDR 流对象 xdrs,并指定流的编码方式为 XDR_ENCODE
  • 接着,调用 xdr_u_char() 函数对 val 进行编码,如果编码成功,则调用 xdr_getpos() 函数获取编码后数据的长度,该长度将作为解码时的参数;
  • 再然后,再次调用 xdrmem_create() 函数创建一个 XDR 流对象 xdrs 并指定流的编码方式为 XDR_DECODE
  • 再接着,调用 xdr_u_char() 函数对编码后的数据进行解码,并将结果存储到变量 result 中;
  • 最后输出编码前的值、编码后的长度和解码后的值。

3. xdr_u_hyper

3.1 函数说明

函数声明 函数功能
bool_t xdr_u_hyper(XDR *xdrs, u_hyper *uhp); 用于编码和解码 u_hyper 类型的数据

参数:

  • xdrs : 指向要编码或解码数据的 XDR 结构体的指针
  • uhp : 指向 u_hyper 类型变量的指针

返回值:

  • 如果编码或解码成功,则返回值为 TRUE
  • 否则返回值为 FALSE

3.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main() 
{
    XDR xdrs;
    u_hyper value = 12345678901234567890ULL; // 定义一个 64 位无符号整数
    char buffer[16];
    char *bufptr = buffer;

    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_ENCODE);
    if (!xdr_u_hyper(&xdrs, &value)) 
    { 
        printf("Serialization error");
        return 1;
    }

    // 将编码后的数据打印出来
    for (int i = 0; i < sizeof(buffer); i++) {
        printf("%02x ", buffer[i]);
    }
    printf("\n");

    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_DECODE);
    if (!xdr_u_hyper(&xdrs, &value)) 
    { 
        printf("Deserialization error");
        return 1;
    }

    printf("%llu\n", value); // 打印解码后的值

    return 0;
}

在上面的示例代码中,

  • 首先,我们定义了一个 64 位无符号整数变量 value 并给它赋值 12345678901234567890ULL;
  • 然后,使用 xdrmem_create() 函数创建了一个 XDR 流对象 xdrs,并指定流的编码方式为 XDR_ENCODE
  • 接着,调用 xdr_u_hyper() 函数进行编码操作;如果编码成功,则将编码后的数据打印出来;
  • 再然后,再次调用 xdrmem_create() 函数创建一个 XDR 流对象 xdrs 并指定流的编码方式为 XDR_DECODE
  • 再接着,调用 xdr_u_hyper() 函数对编码后的数据进行解码,并将结果存储到变量 value 中;
  • 最后,输出解码后的值。

4. xdr_u_int

4.1 函数说明

函数声明 函数功能
bool_t xdr_u_int(XDR *xdrs, u_int *a); 用于编码或解码无符号整数

参数:

  • xdrs : 指向要编码或解码数据的 XDR 结构体的指针
  • a : 指向要编码或解码的无符号整数的指针

返回值:

  • 如果编码或解码成功,则返回值为 TRUE
  • 否则返回值为 FALSE

4.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main(void) 
{
    // 将无符号整数编码为 XDR 格式字节流
    unsigned int num = 123456789;
    XDR xdr;
    char buf[4];
    xdrmem_create(&xdr, buf, sizeof(buf), XDR_ENCODE);
    if (!xdr_u_int(&xdr, &num)) 
    {
        printf("Failed to encode unsigned int.\n");
        return 1;
    }
    printf("Encoded bytes: %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]);

    // 从 XDR 格式字节流中解码无符号整数
    unsigned int decoded_num;
    XDR xdr2;
    xdrmem_create(&xdr2, buf, sizeof(buf), XDR_DECODE);
    if (!xdr_u_int(&xdr2, &decoded_num)) 
    {
        printf("Failed to decode unsigned int.\n");
        return 1;
    }
    printf("Decoded number: %u\n", decoded_num);

    return 0;
}

在上面的这个示例程序中,

  • 首先,我们首先创建了一个无符号整数变量 num 并将其设置为 123456789
  • 然后,使用 xdrmem_create() 函数创建了一个 XDR 对象 xdr,并和 buf 绑定;
  • 接着,使用 xdr_u_int() 函数将无符号整数 num 编码为 XDR 格式字节流,并将其写入到缓冲区 buf 中。如果编码过程中出现错误,则输出一条错误消息并返回 1;如果编码成功,则输出编码后的字节流;
  • 再然后,使用 xdrmem_create() 函数创建另一个 XDR 对象 xdr2
  • 再接着,调用xdr_u_int() 函数来解码 XDR 格式字节流中的无符号整数。如果解码过程中出现错误,则输出一条错误消息并返回 1;
  • 最后,解码成功,则输出解码后的无符号整数。

5. xdr_u_long

5.1 函数说明

函数声明 函数功能
bool_t xdr_u_long(XDR *xdrs, u_long *objp); 用于编码或解码无符号长整型值

参数:

  • xdrs : 指向要编码或解码数据的 XDR 结构体的指针
  • objp : 指向要编码或解码的无符号长整型值得指针

返回值:

  • 如果编码或解码成功,则返回值为 TRUE
  • 否则返回值为 FALSE

5.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main()
{
    XDR xdr;
    u_long value = 12345;

    // 打开XDR数据流
    xdrmem_create(&xdr, NULL, 0, XDR_ENCODE);

    // 编码无符号长整型值到XDR数据流中
    if (!xdr_u_long(&xdr, &value)) {
        printf("Unable to encode value.\n");
        return 1;
    }

    // 关闭XDR数据流
    xdr_destroy(&xdr);

    return 0;
}

6. xdr_u_short

6.1 函数说明

函数声明 函数功能
bool_t xdr_u_short(XDR *xdrs, unsigned short *objp); 用于编码或解码无符号短整型数据

参数:

  • xdrs : 指向要编码或解码数据的 XDR 结构体的指针
  • objp : 指向 无符号短整型的指针

返回值:

  • 如果编码或解码成功,则返回值为 TRUE
  • 否则返回值为 FALSE

6.2 演示示例

#include <stdio.h>
#include <rpc/rpc.h>

#define ARRAY_SIZE 3

int main(void) 
{
    XDR xdrs;
    char buffer[1024];
    unsigned short source_array[ARRAY_SIZE] = {1, 2, 3};
    unsigned short dest_array[ARRAY_SIZE];

    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_ENCODE);
    for (int i = 0; i < ARRAY_SIZE; ++i) 
    {
        if (!xdr_u_short(&xdrs, &source_array[i])) 
        {
            printf("编码失败\n");
            return 1;
        }
    }
    xdr_destroy(&xdrs);
    printf("编码结果:\n");
    for (int i = 0; i < xdr_getpos(&xdrs); ++i) 
    {
        printf("%02X ", buffer[i]);
    }
    printf("\n");

    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_DECODE);
    for (int i = 0; i < ARRAY_SIZE; ++i) 
    {
        if (!xdr_u_short(&xdrs, &dest_array[i])) 
        {
            printf("解码失败\n");
            return 1;
        }
    }
    xdr_destroy(&xdrs);
    printf("解码结果:\n");
    for (int i = 0; i < ARRAY_SIZE; ++i) 
    {
        printf("%u ", dest_array[i]);
    }
    printf("\n");

    return 0;
}

7. xdr_vector

7.1 函数说明

函数声明 函数功能
bool_t xdr_short(XDR *xdrs, short *sp); 用于编码或解码一个可变长度的向量

参数:

  • xdrs : 指向要编码或解码数据的 XDR 结构体的指针
  • sp : 指向要编码或解码的 short 类型数据的指针

返回值:

  • 如果编码或解码成功,则返回值为 TRUE
  • 否则返回值为 FALSE

7.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <rpc/types.h>
#include <rpc/xdr.h>

#define MAXSIZE 100

void error(char *s) 
{
    fprintf(stderr, "error: %s\n", s);
    exit(1);
}

int main() 
{
    XDR xdrs;
    char buffer[MAXSIZE];
    int values[] = {1, 2, 3, 4, 5};
    u_int size = sizeof(values)/sizeof(int);

    xdrmem_create(&xdrs, buffer, MAXSIZE, XDR_ENCODE);
    if (!xdr_vector(&xdrs, (char *) values, &size, MAXSIZE, sizeof(int), (xdrproc_t) xdr_int)) 
    {
        error("serialization failed");
    }

    xdrmem_create(&xdrs, buffer, MAXSIZE, XDR_DECODE);
    if (!xdr_vector(&xdrs, (char *) values, &size, MAXSIZE, sizeof(int), (xdrproc_t) xdr_int)) 
    {
        error("deserialization failed");
    }

    for (int i = 0; i < size; i++) 
    {
        printf("%d ", values[i]);
    }
    printf("\n");

    return 0;
}

8. xdr_void

8.1 函数说明

函数声明 函数功能
bool_t xdr_void(void); 用于编码或解码空值【void类型】

返回值: 因为无任何值被编码或解码,所以总是返回 true

8.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <rpc/rpc.h>

int main() 
{
    // 创建一个 xdr_void 数据结构
    XDR xdr;
    xdrmem_create(&xdr, NULL, 0, XDR_ENCODE);

    // 将空值序列化为 xdr_void 类型
    if (!xdr_void(&xdr, NULL))
    {
        fprintf(stderr, "序列化失败\n");
        exit(1);
    }

    // 打印序列化后的结果
    printf("序列化结果:\n");
    int i;
    for (i = 0; i < xdr_getpos(&xdr); i++) {
        printf("%02x ", ((unsigned char *)xdr_inline(&xdr, i))[0]);
    }
    printf("\n");

    // 反序列化 xdr_void 类型
    xdr_destroy(&xdr);
    xdrmem_create(&xdr, xdr_getpos(&xdr), xdr_getpos(&xdr), XDR_DECODE);

    // 尝试反序列化非空的数据到 xdr_void 类型,预期将会失败
    char data[] = {0x01};
    if (xdr_bytes(&xdr, &data, &i, sizeof(data)) != FALSE) {
        fprintf(stderr, "尝试反序列化非空数据到 xdr_void 类型,但成功了\n");
        exit(1);
    }

    // 打印反序列化结果
    printf("反序列化结果:空值\n");

    return 0;
}

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

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:Excel表列名称
    1.简述:给你一个整数 columnNumber,返回它在Excel表中相对应的列名称。例如:A->1B->2C->3...Z->26AA->27AB->28... 示例1:输入:columnNumber=1输出:"A"示例2:输入:columnNumber=28输出:"AB"示例3:输入:columnNumber=701输出:"ZY"示例4:输入:colum......
  • pta题目集1~3总结性blog
    一、前言总结三次题目集的知识点、题量、难度等情况第一次题目集难度较低,题量较多,题目类型和上学期的C语言作业类似,通过第一次题目集主要是让我们熟悉java的语法和格式,java对比C语言还是有很多细微的差别,因此第一次题目集的知识点集中在各种基础语法例如各种循环,还有if语句、swi......
  • 四则运算
    #include<iostream>usingnamespacestd;/*请在这里填写答案*/classComplex{public:Complex(doublea=0,doubleb=0){real=a;imag=b;}Complexoperator+(Complex&a){Complextemp;temp.......
  • 网络编程基础
    OSI七层模型应用层:ttp协议、电子文件传输、文件服务器等表示层:解决我们不同系统之间语法的通讯会话层:建立与应用程序之间的通讯传输层:提供了端口号和接口协议TPC/UDP网络层:为数据包选择路由器、交换机定义了ip地址,可以根据ip地址找到对应的服务器数据链路层:传输有地址的帧......
  • 题目集1-3总结报告
    前言:一 第一次题目集所涉及的知识点有1.从键盘读取数值并参与运算。2.if句和if-else句的判断。3.数值类型的转换。4.数组的创建。5.for语句的循环。6.switch语句的运用。.运用String中的substring方法获取子字符串和equalsIgnoreCase方法比较字符串。8.数组的简单处理。题量......
  • Vue重用组件
    1、是什么?这里主要是简单入门使用一下,复杂高阶的用法笔者暂时还没了解到Vue重用组件是指可以被多个Vue实例重复使用的组件。这些组件可以包含自定义的状态和事件处理程序,并且可以在整个应用程序中共享。重用组件可以减少代码冗余,提高开发效率,并使代码更加模块化和可维护。在Vue......
  • 关于汽车电子NVM的笔记
    一、什么是NVMNVM是英文“Non-VolatileMemory”的缩写,中文翻译为“非易失性存储器”。它是指一种能够在断电情况下依旧保留数据的存储器件。NVM用于存储一些不需要频繁更改的数据,例如汽车电子控制单元(ECU)中的程序代码、校准数据、配置参数以及历史故障码等。二、为什么使用NVM......
  • APP中RN页面渲染流程-ReactNative源码分析
    在APP启动后,RN框架开始启动。等RN框架启动后,就开始进行RN页面渲染了。RN页面原生侧页面渲染的主要逻辑实现是在RCTUIManager和RCTShadowView完成的。通过看UIMananger的源码可以看到,UIMananger导出给JS端的API接口在对UI的操作上,基本都会同时对View和ShadowView进行操作。......
  • 黑与白
    1.问题描述有A、B、C、D、E这5个人,每个人额头上都帖了一张黑或白的纸。5人对坐,每个人都可以看到其他人额头上纸的颜色。5人相互观察后:A说:“我看见有3人额头上贴的是白纸,1人额头上贴的是黑纸。”B说:“我看见其他4人额头上贴的都是黑纸。”C说:“我看见1人额头上贴的是白纸,其他3人......
  • Blog PTA 1-3总结
    关于java&面向对象​这学期才接触java,以前学了C语言,没有接触过面向对象编程,所以一开始对于怎么写,以及java语法有点不太适应。 关于类:类似C语言里面的结构体struct,构造函数,方法都挺相似的。一开始并不适应面向对象程序编程,所以一开始的代码还是以结构化语言的思维方式去思考......