zoukankan      html  css  js  c++  java
  • openssl stack 数据结构栈基本操作

    堆栈是两种不同的数据结构;

    堆:数据先进先出;

    栈:数据先进后观;

    在stack.h 中 openssl 为我们提供了一个通用的栈,利用提供的接口我们可以方便的用此栈来存放开发中的任意数据。

    openssl stack 栈类似于数组,元素下标从0开始;

    1. openssl stack 主要接口有

    //创建一个空栈,参数可指定排序方法,因为openssl不知道里面存放的是什么类型的数据,所以排序方法需要用户实现,当参数为NULL,同下方法
    OPENSSL_STACK *OPENSSL_sk_new(OPENSSL_sk_compfunc cmp);

    //创建一个空栈, OPENSSL_STACK
    *OPENSSL_sk_new_null(void);

    //释放栈,并不释放栈内元素内存
    void OPENSSL_sk_free(OPENSSL_STACK *);

    //删除并释放所有栈内元素,最后释放栈,可以指定回调函数,栈每次释放一个元素都会回调该回调函数
    void OPENSSL_sk_pop_free(OPENSSL_STACK *st, void (*func) (void *));

    //栈深copy, OPENSSL_STACK
    *OPENSSL_sk_deep_copy(const OPENSSL_STACK *, OPENSSL_sk_copyfunc c, OPENSSL_sk_freefunc f);

    //在栈指定位置插入元素,成功返回该栈所有元素的个数
    int OPENSSL_sk_insert(OPENSSL_STACK *sk, const void *data, int where);

    //删除栈指定位置元素,成功返回删除的该元素
    void *OPENSSL_sk_delete(OPENSSL_STACK *st, int loc);

    //删除栈指定元素,成功返回删除的该元素
    void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *st, const void *p);

    //在栈中查找指元素,成功返回该元素位置
    int OPENSSL_sk_find(OPENSSL_STACK *st, const void *data);

    //同上,
    int OPENSSL_sk_find_ex(OPENSSL_STACK *st, const void *data);

    //在栈顶添加一个元素,成功返回栈元素总数
    int OPENSSL_sk_push(OPENSSL_STACK *st, const void *data);

    //在栈位置0次添加一个元素,类似 insert(st,0);
    int OPENSSL_sk_unshift(OPENSSL_STACK *st, const void *data);

    //移出栈位置0处的元素,类似pop
    void *OPENSSL_sk_shift(OPENSSL_STACK *st);

    //在栈顶移出一个元素,并释放该元素内存,
    void *OPENSSL_sk_pop(OPENSSL_STACK *st);

    //设置栈元素为0,不释放栈
    void OPENSSL_sk_zero(OPENSSL_STACK *st);

    //设置栈的排序方法 OPENSSL_sk_compfunc OPENSSL_sk_set_cmp_func(OPENSSL_STACK
    *sk, OPENSSL_sk_compfunc cmp);

    //copy 栈 OPENSSL_STACK
    *OPENSSL_sk_dup(const OPENSSL_STACK *st);

    //栈排序
    void OPENSSL_sk_sort(OPENSSL_STACK *st);

    //栈是否排序
    int OPENSSL_sk_is_sorted(const OPENSSL_STACK *st);

    2. 测试示例

        //创建一个空的栈
        OPENSSL_STACK *st = OPENSSL_sk_new_null();
        
        int a = 10;
        OPENSSL_sk_push(st, &a);
        
        int b = 100;
        OPENSSL_sk_push(st, &b);
        
        char *c = "hello";
        OPENSSL_sk_push(st, c);
        
        char d[10] = {0};
        OPENSSL_sk_push(st, d);
        
        char e = 'A';
        OPENSSL_sk_push(st, &e);
        
    
        //返回栈内数据个数
        if (OPENSSL_sk_num(st)==5) {
            printf("sk_num PASS
    ");
        }
        
        //获取指定index数据
        int *getb = OPENSSL_sk_value(st, 1);
        if (*getb==b) {
            printf("sk_value PASS
    ");
        }
        
        //获取指定数据,返回index
        if (OPENSSL_sk_find(st,"hello")==2) {
            printf("sk_find PASS 
    ");
        }
        
        
        //在位置2插入一个 数据 TAOBAO,返回总数
        if (OPENSSL_sk_insert(st, "TAOBAO", 2)==6) {
            printf("sk_insert PASS
    ");
        }
        
        
    
        int ff = 88;
        OPENSSL_sk_push(st, &ff);
        //在栈顶移出一个数据, 返回删除的元素
        char *popDT = OPENSSL_sk_pop(st);
        if (*popDT==ff) {
            printf("sk_pop PASS
    ");
        }
    
        //从栈中移出所有的元素,并释放内存,并且释放st;
        //每删除一个元素,回调一次popfreeCallBack回调函数
        OPENSSL_sk_pop_free(st, popfreeCallBack);

    输出日志

    sk_num PASS
    sk_value PASS
    sk_find PASS 
    sk_insert PASS
    sk_pop PASS
    pop and free 10 
    pop and free 100 
    pop and free 1112490324 
    pop and free 1819043176 
    pop and free 0 
    pop and free 352053569 
    Program ended with exit code: 0
    View Code

    3. 另外还可以自定义栈

      使用 openssl 提供的safestack.h宏

    测试使用 openssl 1.1.0c

    参考:https://www.openssl.org/docs/man1.1.0/crypto/OPENSSL_sk_new_null.html

  • 相关阅读:
    Smart Client Architecture and Design Guide
    Duwamish密码分析篇, Part 3
    庆贺发文100篇
    .Net Distributed Application Design Guide
    New Introduction to ASP.NET 2.0 Web Parts Framework
    SPS toplevel Site Collection Administrators and Owners
    来自Ingo Rammer先生的Email关于《Advanced .Net Remoting》
    The newsletter published by Ingo Rammer
    深度探索.Net Remoting基础架构
    信道、接收器、接收链和信道接受提供程序
  • 原文地址:https://www.cnblogs.com/cocoajin/p/6139953.html
Copyright © 2011-2022 走看看