zoukankan      html  css  js  c++  java
  • Ring Buffer -- C语言

    #include <stdint.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>#define MIN(a, b)               ((a) < (b) ? (a) : (b))
    #define MAX(a, b)               ((a) > (b) ? (a) : (b))
    
    uint32_t RingBuf_Write(uint8_t *rbuf, uint32_t maxsize, uint32_t tail, uint8_t *src, uint32_t len)
    {
        uint8_t *buf1 = rbuf + tail;
        int      len1 = MIN(maxsize-tail, len);
        uint8_t *buf2 = rbuf;
        int      len2 = len  - len1;
        memcpy(buf1, src + 0   , len1);
        memcpy(buf2, src + len1, len2);
        return len2 ? len2 : tail + len1;
    }
    
    uint32_t RingBuf_Read(uint8_t *rbuf, uint32_t maxsize, uint32_t head, uint8_t *dst, uint32_t len)
    {
        uint8_t *buf1 = rbuf + head;
        int      len1 = MIN(maxsize-head, len);
        uint8_t *buf2 = rbuf;
        int      len2 = len  - len1;
        if (dst) memcpy(dst + 0   , buf1, len1);
        if (dst) memcpy(dst + len1, buf2, len2);
        return len2 ? len2 : head + len1;
    }
    int main(int argc, char *argv[]){
        int maxsize = 4;
        uint8_t  * rbuf = malloc(maxsize);
        int tail = 0;
        uint8_t * src = "hello";
        uint32_t  len = strlen(src);
        uint32_t  out = RingBuf_Write(rbuf,maxsize,tail,src,len);
        printf("out:%d
    ",out);
        printf("rbuf:%s
    ",rbuf);
    
        printf("---------
    ");
    
        int head = 0;
        uint8_t *dst = malloc(8);
        uint32_t ret = RingBuf_Read(rbuf,maxsize,head,dst,2);
    
        printf("ret:%d
    ",ret);
        printf("dst:%s
    ",dst);
    
    
        return 0;
    }

    摘录自:https://github.com/rockcarry/ffrdp

  • 相关阅读:
    线程池参数详解
    线程池各个参数详解以及如何自定义线程池
    fastdfs 安装
    SQL 执行顺序
    《SQL 进阶教程》 查找局部不一致的数据
    redis 高性能的原因
    一致性hash
    环境部署数据库报错
    redis 常用命令
    redis 高级学习和应用场景
  • 原文地址:https://www.cnblogs.com/iuyy/p/13776589.html
Copyright © 2011-2022 走看看