【linux环境C/C++编程高频函数归纳】

1.获取当前系统时间

源码

#include <stdio.h>  //printf
#include <stdint.h> //uint
#include <sys/time.h> //timeval
#include <unistd.h> //uslepp

 /*
 * @brief 返回当前系统时间
 * @param[in] null
 * @param[out] null
 * @return uint64_t 当前时间戳ms
 */
uint64_t time_now(void)
{
    struct timeval lTime;   
    gettimeofday(&lTime, 0);
    return (lTime.tv_sec * 1000 + lTime.tv_usec/1000);  //ms
}

int main()
{
    uint64_t time_1 = time_now();
    usleep(1000*1000);
    uint64_t time_2 = time_now();
    printf("time1:[%ld] time2:[%ld] interval:[%ld]\n",time_1,time_2,time_2-time_1);
    return 0;
}

运行结果

在这里插入图片描述

2.按位设置byte值

源码

#include <stdio.h> //printf
#include <stdint.h>  //uint
/**
 * @brief 按指定的位设置0或1
 * @param[in] data 需修改的字节
 * @param[in] bit  需修改的位 0-7
 * @param[in] value 需修改的值 0或1
 * @param[out] null
 * @return int 0:操作成功 || -1:输入参数不合法
 */
int  setBitValue(uint8_t* data,int bit,int value)
{
    if(value>1 || value<0 || NULL == data || bit>7 || bit<0)
    {
        return -1;
    }

    if(value == 0)
    {
        *data &= ~ (0x1 << bit);//bit位置0
    }
    else{
        *data |= (0x1 << bit);//bit位置1
    }
    return 0;
}

int main()
{
    uint8_t data[2] = {0x0};
    
    setBitValue(&data[0],3,1); //b: 0000 1000
    setBitValue(&data[0],4,1); //b: 0001 1000

    setBitValue(&data[1],6,1); //b: 0100 0000
    setBitValue(&data[1],2,1); //b: 0100 0010

    char result[16] = {0x0};
    for(int i = 0;i<2;i++)
    {
        printf("%x\n",data[i]);
    }
    return 0;
}

运行结果

在这里插入图片描述

3.获取文件大小

源码

#include <stdio.h>   //printf
#include <sys/stat.h> //stat
#include <string.h> //memset
/**
 * @brief 获取文件大小
 * @param[in] filepath 文件路径
 * @return size_t 文件大小
 */
size_t get_file_size(const char *filepath)
{
    /*check input para*/
    if(NULL == filepath)
    {
        printf("File path is null...\n");
        return 0;
    }
    struct stat filestat;
    memset(&filestat,0,sizeof(struct stat));
    /*get file information*/
    if(0 == stat(filepath,&filestat))
    {
        return filestat.st_size;
    }
    else{
        printf("stat %s size failed...\n",filepath);
        return 0;
    }
}

int main()
{
    printf("%ld\n",get_file_size("123.txt"));
    return 0;
}

运行结果

在这里插入图片描述

4.读取文件内容到buff

源码


#include <stdio.h>   //printf
#include <sys/stat.h> //stat
#include <string.h> //memset
#include <stdint.h> //uint
#include <stdlib.h> //malloc/free
/**
 * @brief 获取文件大小
 * @param[in] filepath 文件路径
 * @return size_t 文件大小
 */
size_t get_file_size(const char *filepath)
{
    /*check input para*/
    if(NULL == filepath)
    {
        printf("File path is null...\n");
        return 0;
    }
    struct stat filestat;
    memset(&filestat,0,sizeof(struct stat));
    /*get file information*/
    if(0 == stat(filepath,&filestat))
    {
        return filestat.st_size;
    }
    else{
        printf("stat %s size failed...\n",filepath);
        return 0;
    }
}

/**
 * @brief 读出文件到buff
 * @param[in] filepath 文件路径
 * @return uint8_t* 使用字节流,需要对空间进行释放
 */
uint8_t* read_file_to_buf(const char *filepath)
{
    /*check input para*/
    if(NULL == filepath)
    {
        printf("File path is null...\n");
        return NULL;
    }
    /*get file size*/
    size_t f_size = get_file_size(filepath);
    if(0 == f_size)
    {
        printf("File is empty...\n");
        return NULL;
    }

    /*malloc memory*/
    uint8_t *buf = (uint8_t*)malloc(f_size + 1);
    if(NULL == buf)
    {
        printf("Failed to malloc for file...");
        return NULL;
    }
    memset(buf,0,f_size + 1);
    
    /*read string from file*/
    FILE *fp = fopen(filepath,"r");
    if(NULL == fp)
    {
        printf("Failed to open %s\n",filepath);
        return  NULL;
    }
    size_t readSize = fread(buf,1,f_size,fp);
    fclose(fp);
    if(readSize != f_size)
    {
        /*read error*/
        free(buf);
        buf = NULL;
        return NULL;
    }

    buf[f_size] = 0;
    return buf;
}


int main()
{
    uint8_t* buff = NULL;

    buff = read_file_to_buf("123.txt");

    printf("buff:%s\n",buff);
    free(buff);
    buff = NULL;
    return 0;
}

运行结果

在这里插入图片描述

5.将字符串转换成整数

源码

#include <stdio.h>

/**
 * @brief 将字符串转成int
 * @param[in] 字符串
 * @return int结果
 */
int my_atoi(char* str)
{
   int value = 0;
   int sign = 1;

   if(*str == '-')
   {
      sign = -1;
      str++;
   }

   while(*str !='\0')
   {
      //('0':assic(48) | '9':assic(57))
      if(*str>= 48 && *str <=57)//过滤非0~9字符
      {
         value = value*10 + (*str - '0');
      }
      str++;
   }
   return value*sign;
}

int main()
{
    char str_1[16] = "112233";
    printf("str1:%d\n",my_atoi(str_1));
    char str_2[16] = "11ks22ll33";
    printf("str2:%d\n",my_atoi(str_2));
    char str_3[16] = "-11ks22ll33";
    printf("str3:%d\n",my_atoi(str_3));
    return 0;
}

运行结果

在这里插入图片描述

6.字符串分割

源码

#include <stdio.h>
#include <string.h> //bzero
/**
 * @brief 将字符串转成int
 * @param[in] 字符串
 * @return int结果
 */
int my_atoi(char* str)
{
   int value = 0;
   int sign = 1;

   if(*str == '-')
   {
      sign = -1;
      str++;
   }

   while(*str !='\0')
   {
      //('0':assic(48) | '9':assic(57))
      if(*str>= 48 && *str <=57)//过滤非0~9字符
      {
         value = value*10 + (*str - '0');
      }
      str++;
   }
   return value*sign;
}

/**
 * @brief 将字符串分割成整型数组
 * @param[in] 字符串
 * @param[in] 分割符
 * @param[in] 输出结果
 * @return 未使用
 */
int my_strtok(char* str,char sep,int* output)
{
   char token[8]={0x0};
   int index = 0;
   int i = 0;
   printf("src_str:%s\n",str);
   while(*str !='\0')
   {
      if(*str != sep)
      {
         token[index++] = *str;
      }
      else{
         //printf("target_str:%s\n",token);
         output[i++] = my_atoi(token);
         index = 0;
      }
      str++;
   }
   //printf("target_str:%s\n",token);
   output[i] = my_atoi(token);
   return 0;
}

int main()
{
    char str0[40]="1>2>3";
    char str1[40]="11-22-33";
    char str2[40]="-111>222>333";
    int output[3]={0x0};

    my_strtok(str0,'>',output);
    for(int i = 0;i<3;i++)
    {
        printf("output[%d]=%d ",i,output[i]);
    }
    printf("\n");
    bzero(output,sizeof(output));

    my_strtok(str1,'-',output);
    for(int i = 0;i<3;i++)
    {
        printf("output[%d]=%d ",i,output[i]);
    }
    printf("\n");
    bzero(output,sizeof(output));

    my_strtok(str2,'>',output);
    for(int i = 0;i<3;i++)
    {
        printf("output[%d]=%d ",i,output[i]);
    }
    printf("\n");

    return 0;
}

运行结果

在这里插入图片描述

7.模块初始化全局变量

源码

#include <stdio.h>

struct _model_test_globalvariables{
    int a;
    int b;
    int c;
    _model_test_globalvariables():a(3),b(4),c(5){};
}test_gv;

int main()
{
    printf("a=%d b=%d c=%d\n",test_gv.a,test_gv.b,test_gv.c);
}

运行结果

在这里插入图片描述

8.switch常规用法

源码

#include <stdio.h>

 /*
 * @brief 测试case未加break,会顺序执行所有case
 * @param[in] status
 * @param[out] null
 * @return void
 */
void test_auto_switch(int status)
{
    switch (status)
    {
    case 1:
        printf("input status:%d This is test 1\n",status);
        //break;
    case 2:
        printf("input status:%d This is test 2\n",status);
        //break;

    default:
        printf("input status:%d This is test default\n",status);
        break;
    }
}

 /*
 * @brief 测试switch可以接受范围值
 * @param[in] value
 * @param[out] null
 * @return void
 */
void test_value_range(int value)
{
    switch (value)
    {
    case 1 ... 100:
        printf("input value:%d Range 1 ~ 100\n",value);
        break;
    
    case 101 ... 200:
        printf("input value:%d Range 101 ~ 200\n",value);
        break;

    case 201 ... 300:
        printf("input value:%d Range 201 ~ 300\n",value);
        break;

    default:
        break;
    }
}

int main()
{
    test_auto_switch(1);
    test_auto_switch(2);

    test_value_range(155);
    test_value_range(219);
    test_value_range(100);
    test_value_range(101);
    return 0;
}

运行结果

在这里插入图片描述

9.获取数据或文件的md5值

源码

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define MD5_FILE_NAME "md5.txt"
#define GENERATE_MD5_CMD "md5sum md5.txt"
#define DELETE_MD5_CMD "rm -f md5.txt"

uint8_t payload[5] = {0x31,0x32,0x33,0x34,0x35};

int get_data_md5_value(uint8_t* val,uint32_t nval,char* out)
{   
    FILE* fp = fopen(MD5_FILE_NAME,"w");
    if(NULL == fp)
    {
        printf("Failed to open %s.\n",MD5_FILE_NAME);
        return -1;
    }
    size_t ret_size = fwrite(val,1,nval,fp);
    printf("Write %ld byte to %s.\n",ret_size,MD5_FILE_NAME);
    fclose(fp);

    FILE* pp = popen(GENERATE_MD5_CMD,"r");
    if(NULL == pp)
    {
        printf("Failed to exec %s.\n",GENERATE_MD5_CMD);
        return -2;
    }

    char buf[1024]={0x0};
    while(NULL !=fgets(buf,sizeof(buf),pp))
    {
        printf("%s",buf);
    }
    memcpy(out,buf,32);
    pclose(pp);
#if 0
    FILE* dp = popen(DELETE_MD5_CMD,"r");
    if(NULL == dp)
    {
        printf("Failed to exec %s.\n",DELETE_MD5_CMD);
        return -3;
    }
    pclose(dp);
#endif
    return 0;
}

int main()
{
    char md5_str[64] = {0x0};
    int ret =  get_data_md5_value(payload,sizeof(payload),md5_str);
    if(ret == 0)
    {
        printf("md5 str:[%s]\n",md5_str);
    }
    return 0;
}

   

执行结果

在这里插入图片描述

10.将hexString转成hexByteArray

源码


#include <stdio.h>
#include <stdint.h>
#include <string.h>

char hexString[] = "827ccb0eea8a706c4c34a16891f84e7b";

// '0' = 48
// '9' = 57
// 'A' = 65
// 'Z' = 90
// 'a' = 97
// 'z' = 122
//65-55 = 10 0x0a
//97-55 = 42 0x2a

uint8_t hexString2HexArray(char *str, uint8_t *out)
{
    int index = 0;
    int str_len = strlen(str);
    if(str_len % 2 != 0)
    {
        printf("It is not a std hex string\n");
    }
    char *p = str;
    uint8_t high = 0x0;
    uint8_t low = 0x0;
    for(index = 0;index<str_len/2;index++)
    {
        high = (*p > '9' && *p <= 'f')? *p -55: *p - 48;
        p++;
        low = (*p > '9' && *p <= 'f')? *p -55: *p - 48;
        out[index] = ((high & 0xf) << 4 | (low & 0xf));
        printf("high = %02x low = %02x out = %02x \n",high,low,out[index]);

        p++;
    }
    if(str_len % 2 == 1)
    {
        out[index] = (*p > '9' && *p <= 'f')? *p -55: *p - 48;
    }
    return str_len/2 + str_len % 2;
}

int main()
{
    uint8_t md5_value[16] = {0x0};

    int len = hexString2HexArray(hexString, md5_value);
    printf("input str:%s\n",hexString);
    for(int i= 0;i<len;i++)
    {
        printf("0x%02x ",md5_value[i]);
    }
    printf("\n");
    return 0;
}

执行结果

在这里插入图片描述

11.时间戳和时间字符串相互转化

源码

#include <stdio.h>
#include <time.h>

// 将tm结构转换为时间戳
int convert_string_to_time()
{
    struct tm date = {0};
    date.tm_year = 2024 - 1900; // 年份从1900年开始
    date.tm_mon = 5 - 1;    // 月份从0开始(0-11代表1-12月)
    date.tm_mday = 10;        // 日期
    date.tm_hour = 16;
    date.tm_min = 20;
    date.tm_sec = 50;

    time_t now = mktime(&date);
    
    printf("time:%ld\n",now);
    return  0;
}

// 将时间戳转成time string
int convert_time_to_string()
{
    time_t now = time(NULL); // 获取当前时间戳
    printf("time_now:%ld\n",now);
    struct tm* tm_local = localtime(&now); // 转换为本地时间
 
    static char date[32]; // 静态数组存储结果
#if 1
    sprintf(date, "%04d/%02d/%02d %02d:%02d:%02d",
                    tm_local->tm_year + 1900,
                    tm_local->tm_mon + 1,
                    tm_local->tm_mday, 
                    tm_local->tm_hour,
                    tm_local->tm_min,
                    tm_local->tm_sec);
#else
    strftime(date,sizeof(date),"%Y/%m/%d %H:%M:%S",tm_local);
#endif
    printf("Date: %s\n", date);
    return 0;
}

int main() 
{
    convert_time_to_string();
    convert_string_to_time();
    return 0;
}

运行结果

在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值