#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
double e_change_to_(char *p)
{
   double b=0;
   int f=1,s=-1,i,exp=0;
   if(*p=='-')f=-1,p++;
   while(*p!='e'&&*p!='E') {
      if(*p=='.'){
         s=1;
      }else{
         if(s<0){
              b=b*10+*p-48;
         } else {
             if(*p=='.')p++;
             s*=10;
             b+=(double)(*p-48)/s;
         }      
      }
      p++;
   }
   b*=f;
   if(*(++p)=='-'){
      s=-1,p++;
   }else{
     if(*p=='+')
         p++,s=1;
     else 
         s=1;
   }
   do exp=exp*10+*p-48;while(*(++p));

   if(s>0){
      for(i=0;i<exp;i++)b*=10;
   }else{
    for(i=0;i<exp;i++)b/=10;
   }
   return b;
}



//CRC 码表低字节
unsigned char ykc_gabyCRCLo[] =
{
	0x00,0xc0,0xc1,0x01,0xc3,0x03,0x02,0xc2,0xc6,0x06,
	0x07,0xc7,0x05,0xc5,0xc4,0x04,0xcc,0x0c,0x0d,0xcd,
	0x0f,0xcf,0xce,0x0e,0x0a,0xca,0xcb,0x0b,0xc9,0x09,
	0x08,0xc8,0xd8,0x18,0x19,0xd9,0x1b,0xdb,0xda,0x1a,
	0x1e,0xde,0xdf,0x1f,0xdd,0x1d,0x1c,0xdc,0x14,0xd4,
	0xd5,0x15,0xd7,0x17,0x16,0xd6,0xd2,0x12,0x13,0xd3,
	0x11,0xd1,0xd0,0x10,0xf0,0x30,0x31,0xf1,0x33,0xf3,
	0xf2,0x32,0x36,0xf6,0xf7,0x37,0xf5,0x35,0x34,0xf4,
	0x3c,0xfc,0xfd,0x3d,0xff,0x3f,0x3e,0xfe,0xfa,0x3a,
	0x3b,0xfb,0x39,0xf9,0xf8,0x38,0x28,0xe8,0xe9,0x29,
	0xeb,0x2b,0x2a,0xea,0xee,0x2e,0x2f,0xef,0x2d,0xed,
	0xec,0x2c,0xe4,0x24,0x25,0xe5,0x27,0xe7,0xe6,0x26,
	0x22,0xe2,0xe3,0x23,0xe1,0x21,0x20,0xe0,0xa0,0x60,
	0x61,0xa1,0x63,0xa3,0xa2,0x62,0x66,0xa6,0xa7,0x67,
	0xa5,0x65,0x64,0xa4,0x6c,0xac,0xad,0x6d,0xaf,0x6f,
	0x6e,0xae,0xaa,0x6a,0x6b,0xab,0x69,0xa9,0xa8,0x68,
	0x78,0xb8,0xb9,0x79,0xbb,0x7b,0x7a,0xba,0xbe,0x7e,
	0x7f,0xbf,0x7d,0xbd,0xbc,0x7c,0xb4,0x74,0x75,0xb5,
	0x77,0xb7,0xb6,0x76,0x72,0xb2,0xb3,0x73,0xb1,0x71,
	0x70,0xb0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,
	0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9c,0x5c,
	0x5d,0x9d,0x5f,0x9f,0x9e,0x5e,0x5a,0x9a,0x9b,0x5b,
	0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4b,0x8b,
	0x8a,0x4a,0x4e,0x8e,0x8f,0x4f,0x8d,0x4d,0x4c,0x8c,
	0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,
	0x43,0x83,0x41,0x81,0x80,0x40
};

//CRC 码表高字节
unsigned char ykc_gabyCRCHi[] =
{
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
	0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,
	0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,
	0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,
	0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
	0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
	0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,
	0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
	0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
	0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,
	0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
	0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,
	0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,
	0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
	0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,
	0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
	0x80,0x41,0x00,0xc1,0x81,0x40
};

unsigned short YKC_Platform_AddChecksum(unsigned char *pData,int len)
{
	unsigned char byCRCHi = 0xff;
	unsigned char byCRCLo = 0xff;
	unsigned char byIdx;
	unsigned short crc;
	
	while(len--)
	{
		byIdx = byCRCHi ^* pData++;
		byCRCHi = byCRCLo ^ ykc_gabyCRCHi[byIdx];
		byCRCLo = ykc_gabyCRCLo[byIdx];
	}
	crc = (byCRCHi << 8) + byCRCLo;
	return crc;
}

uint16_t PY_CRC_16_T8_X25(uint8_t *di, uint32_t len)
{
	uint16_t crc_poly = 0x1021;  //X^16+X^12+X^5+1 total 16 effective bits without X^16. 
	uint16_t data_t = 0; //CRC register

	uint8_t cdata[len];
	for(uint32_t j=0;j<len;j++)
	{
		cdata[j] = 0;
		for(uint8_t m=0; m<=7; m++)
		{
			cdata[j] |= ( ( di[j]>>(7-m) ) & 1 ) << m;
		}
	}

	cdata[0] ^= 0xff; cdata[1] ^= 0xff;

    for(uint32_t i = 0; i < len; i++)
    {
    	data_t ^= cdata[i]<<8; //8-bit data

        for (uint8_t j = 0; j < 8; j++)
        {
            if (data_t & 0x8000)
            	data_t = (data_t << 1) ^ crc_poly;
            else
            	data_t <<= 1;

        }
    }

    uint16_t i_data_t = 0;

    for(uint8_t n=0; n<=15; n++)
    {
   	 i_data_t |=  ( ( data_t>>(15-n) ) & 1 ) << n;
    }

    return i_data_t ^ 0xFFFF;
}



#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <unistd.h>

#define MASK "255.255.0.255."
int dealMask(int x,int *buf,int ret){
        int i = ret * 8;
        while( (x/2) !=0 )
        {
                buf[i-1] = x%2;
                x = x/2;
                i--;
        }
        buf[i-1] = x%2;

        return i;

}
int transer(char *mark){
        char temp[8] = {0};
        int buf[32] = {0};
        char *str  = temp;
        char *head = mark;
        int count = 0;
        int ret = 1;
        int i = 0;
        int j = 0;
        while(*head != '\0'){
                *str = *head;
                if(*(head+1) == '.'|| *(head+1)== '\0'){
                        head = head +2;
                        dealMask(atoi(temp),buf,ret);
                        ret++;
                        memset(temp,0,sizeof(temp));
                        str = temp;
                        continue;
                }
                str++;
                head++;

        }
        for(i = 1;i <33;i++){
                if(buf[i-1] == 1){
                        j++;
                }
               // printf("%d",buf[i-1]);
               // if((i%8) == 0){
               //         printf("\n");
               // }
        }
        printf("%d\n",j);

}
 

#include <sys/types.h>
#include <dirent.h>
#include <time.h>

uint32_t return_7_day_time(void)
{
    char data_str[128];
    time_t now;  // 声明time_t类型变量
    now = time(NULL);  // 获取系统日期和时间
    now = now - 7 * 24 * 60 * 60;
    struct tm *t = localtime(&now); //获取当地日期和时间
    snprintf(data_str, sizeof(data_str), "%d%02d%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday);

    printf("\n----------return_7_day_time[%s]\n", data_str);
    return atoi(data_str);
}

#define MAX_FILENAME_LENGTH 512U

int dirWalk(char* dirpath)
{
	// Bad address
	if (!dirpath || !strlen(dirpath))
	{
		return 0;
	}
	
	//  获得目录结构体指针
	DIR* pDir = opendir(dirpath);
	if (pDir == NULL)
	{
		return 0;
	}

	// 遍历该目录下文件，遇到目录则递归遍历
	int err = 0;
	struct dirent* ent;
	while (ent = readdir(pDir))
	{
		// 目录，递归
		if (ent->d_type == DT_DIR)
		{			
			if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
			{
				continue;
			}
			// 判断目标路径是否过长
			if (strlen(dirpath) + ent->d_reclen + 1 >= MAX_FILENAME_LENGTH)
			{
				return 0;
			}
			// 拼接出目标目录的路径
			char nextDirPath[MAX_FILENAME_LENGTH];
			sprintf(nextDirPath, "%s/%s", dirpath, ent->d_name);
			printf("nextDirPath: %s\n", nextDirPath);
			
			// 递归访问该目录
			err = dirWalk(nextDirPath);
			memset(nextDirPath, 0, MAX_FILENAME_LENGTH);
			if (err != 0) break;
			
		}
		// 普通文件
		else if (ent->d_type == DT_REG)
		{
			printf(">> %s\n", ent->d_name);
			if (err != 0) break;
		}
	}

	closedir(pDir);
	return err;
}


static uint8_t  oem_u[256];
static uint8_t oem_ul = 0; 
 
//---提取参考周与参考秒的函数
void GPS_time_week_second(char* str, int len, uint32_t *week, uint32_t *second)
{
    int i = 0;
    
    for(i = 0; i < len; i++, oem_ul++){
        oem_u[oem_ul] = str[i];
        //查找二进制头数据------------
       // printf("%02x ", oem_u[oem_ul]&0xff);
        if(oem_u[(uint8_t) (oem_ul - 19)] == 0xaa && 
           oem_u[(uint8_t) (oem_ul - 18)] == 0x44 &&
           oem_u[(uint8_t) (oem_ul - 17)] == 0x12 &&
           oem_u[(uint8_t) (oem_ul - 16)] == 0x1c 
        ){ //匹配到数据头  提取周数和秒数
            *second =  (((oem_u[(uint8_t) (oem_ul - 0)] & 0xff) << 24)  + 
                       ((oem_u[(uint8_t) (oem_ul - 1)] & 0xff) << 16)  +
                       ((oem_u[(uint8_t) (oem_ul - 2)] & 0xff) << 8) +
                       ((oem_u[(uint8_t) (oem_ul - 3)] & 0xff) << 0))/1000;

            *week =  ((oem_u[(uint8_t) (oem_ul - 4)] & 0xff) << 8)  +
                     ((oem_u[(uint8_t) (oem_ul - 5)] & 0xff) << 0);
                     
            *week = (*week);
            printf("week:%u second:%u[%02x%02x%02x%02x][%02x%02x]\n", *week, *second,
                  oem_u[(uint8_t) (oem_ul - 0)], oem_u[(uint8_t) (oem_ul - 1)],
                   oem_u[(uint8_t) (oem_ul - 2)],  oem_u[(uint8_t) (oem_ul - 3)],
                   oem_u[(uint8_t) (oem_ul - 4)], oem_u[(uint8_t) (oem_ul - 5)]);
        }  
    }
}

  
// GPS时间是从1980年1月6日开始计算的
#define GPS_EPOCH_YEAR 1980
#define GPS_EPOCH_MONTH 1
#define GPS_EPOCH_DAY 6
#define SECONDS_PER_DAY (24*60*60)
#define DAYS_PER_WEEK 7
#define SECONDS_PER_WEEK (SECONDS_PER_DAY * DAYS_PER_WEEK)
 
void GPSTimeToCalendar(unsigned int week, unsigned int seconds, struct tm *calendarTime) 
{
    time_t gpsEpoch = 0;
    time_t gpsTime = 0;
 
    // 将GPS时代的开始转换为time_t（即自Unix纪元以来的秒数）
    struct tm epoch = {0};
    epoch.tm_year = GPS_EPOCH_YEAR - 1900; // tm_year是从1900年开始的年数
    epoch.tm_mon = GPS_EPOCH_MONTH - 1;   // tm_mon是从0开始的月数
    epoch.tm_mday = GPS_EPOCH_DAY;
    gpsEpoch = mktime(&epoch);
 
    // 将周数转换为秒数
    gpsTime = gpsEpoch + week * SECONDS_PER_WEEK + seconds;
 
    // 将GPS时间转换为日历时间
    if (gmtime_r(&gpsTime, calendarTime) == NULL) {
        // 错误处理
        calendarTime->tm_year = 0;
        calendarTime->tm_mon = 0;
        calendarTime->tm_mday = 0;
        // 可以在这里添加错误处理逻辑
    }
}
long getFileSize(FILE* file) {
    long size;
    fseek(file, 0, SEEK_END);
    size = ftell(file);
    fseek(file, 0, SEEK_SET);
    return size;
}

void ret_static_file_start_end_time(char* path, char*st, int len1,  char*et, int len2)
{
    char buf[4096*3] = {0};
    
    uint32_t start_week = 0;    //记录开始时间
    uint32_t start_second = 0;
    uint64_t file_size = 0;

    uint32_t end_week = 0;      //记录结束时间
    uint32_t end_second = 0;
    int ret = 0;

    struct tm calendarTime = {0};
    int flag = 0;

    FILE *fp = fopen(path, "r");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return;
    }
    file_size = getFileSize(fp);
    printf("\n---file size = [%d]\n", file_size);
    while ((ret = fread(buf, 1, sizeof(buf), fp)) > 0) {
        // 处理读取到的数据
        // 例如，可以将数据打印为十六进制（这里为了简单起见，省略了具体处理逻辑）
        GPS_time_week_second(buf, ret, &end_week, &end_second);
        if(flag == 0){
            start_week = end_week;
            start_second = end_second;
            flag = 1;
 #if 1           
            if(file_size > 33333){ //文件太大  反过来查找
                 printf("\nthis is a big file\n");
                 fseek(fp,-10000L,2);
            }
 #endif
        }
    }

    GPSTimeToCalendar(start_week, start_second, &calendarTime);
    snprintf(st, len1, "%d-%02d-%02d %02d:%02d:%02d", calendarTime.tm_year + 1900, 
                       calendarTime.tm_mon + 1, calendarTime.tm_mday,
                       calendarTime.tm_hour, calendarTime.tm_min, calendarTime.tm_sec);

    printf("start_week:%d start_second:%d  [%s]\n", start_week, start_second, st);
    GPSTimeToCalendar(end_week, end_second, &calendarTime);
    snprintf(et, len2, "%d-%02d-%02d %02d:%02d:%02d", calendarTime.tm_year + 1900,
                       calendarTime.tm_mon + 1, calendarTime.tm_mday,
                       calendarTime.tm_hour, calendarTime.tm_min, calendarTime.tm_sec);

        printf("end_week:%d end_second:%d  [%s]\n", end_week, end_second, et);

 a
    if (ferror(fp)) {
        perror("Error reading file");
    }
 
    fclose(fp);
    fp = NULL;
 
}


int main()
{ 
    short t1 = -8;
    unsigned int t2 = 0;
    unsigned int t3 = 0;
    char c1[50];
    
    snprintf(c1, 50,"%u", t1);
    t3 = strtoul(c1,NULL, 10);
    printf("t1 = [%.x][%s][%.x]", t1, c1, t3);
    printf("\n end \n");
    return 0;





   char d_str[] = {0x24,0x1d,0x9f,0x01,0x00,0x00,0xc0,0xff};
   
   char d_str1[] = {0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x7f}; 

   printf("\n d_str:[%.16lf] \n", *((double*)d_str1));
return 0;

  char startTime[256];
  char end_time[256];
  ret_static_file_start_end_time("1_rover_202411300249.DAT",
       startTime, sizeof(startTime),  end_time, sizeof(end_time));
  return 0;
}
