yy1717
2020-08-12 539bdbbebc2410bbad25af01d9088594d02c95b0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//
// Created by YY on 2020/1/7.
//
 
#include "xconvert.h"
#include <cstdint>
#include <cstring>
 
#define SECONDS_PER_MINUTE  60
#define SECONDS_PER_HOUR    3600
#define SECONDS_PER_DAY     (86400L)
 
#define MINUTES_PER_HOUR    60
#define MINUTES_PER_DAY     1440
 
#define HOURS_PER_DAY       24
 
#define DAYS_PER_WEEK       7
#define DAYS_PER_YEAR       365
 
double ConvertKMh2Ms(int kmh)
{
    return ((double)kmh) * 1000.0 / 3600.0;
}
 
double ConvertMs2KMh(double ms)
{
    return ms * 3600.0 / 1000.0;
}
 
void ConvertPhoneNum(uint8_t *dst, int length, const char *src)
{
    int p = length - 1;
    int q = strlen(src) - 1;
 
    memset(dst, 0, length);
 
    while (q >= 0) {
        dst[p] = src[q] - '0';
        q--;
        if (q >= 0) {
            dst[p] |= (src[q] - '0')<<4;
            p--;
            q--;
        }
    }
}
 
void ConvertHex2String(char *str, const uint8_t *hex, int length)
{
    const char HEX[] = "0123456789ABCDEF";
    int j = 0;
 
    for (int i = 0; i < length; ++i) {
        str[j++] = HEX[(hex[i]>>4)&0x0F];
        str[j++] = HEX[hex[i]&0x0F];
    }
    str[j++] = 0;
}
 
void ConvertString2Hex(uint8_t *hex, int length, const char *str)
{
    if (length < strlen(str)/2) return;
 
    for (int i = 0, j = 0; i < strlen(str); ++i, ++j) {
        if (str[i] >= '0' && str[i] <= '9') {
            hex[j] = str[i] - '0';
        } else if (str[i] >= 'A' && str[i] <= 'F') {
            hex[j] = 10 + str[i] - 'A';
        } else if (str[i] >= 'a' && str[i] <= 'f') {
            hex[j] = 10 + str[i] - 'a';
        }
        hex[j] <<= 4;
        i++;
        if (str[i] >= '0' && str[i] <= '9') {
            hex[j] |= str[i] - '0';
        } else if (str[i] >= 'A' && str[i] <= 'F') {
            hex[j] |= 10 + str[i] - 'A';
        } else if (str[i] >= 'a' && str[i] <= 'f') {
            hex[j] |= 10 + str[i] - 'a';
        }
    }
}
 
const int LibTimeDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
static inline bool TimeYearIsLeap(int year)
{
    if ((year % 4) || year == 2100)
        return false;
    else
        return true;
}
 
uint32_t TimeMakeComposite(int year, int month, int day, int hour, int minute, int second)
{
    int i;
    uint32_t totalSeconds;
    int daysThisYear;
 
    totalSeconds = second;
    totalSeconds += minute*SECONDS_PER_MINUTE;
    totalSeconds += hour*SECONDS_PER_HOUR;
 
    daysThisYear = day - 1;
    if (TimeYearIsLeap(year) && month>2)
        daysThisYear += 1;
 
    for (i = 0; i<(month - 1); i++)
        daysThisYear += (int)LibTimeDays[i];
 
    for (i = 2000; i<year; i++) {
        daysThisYear += 365;
        if (TimeYearIsLeap(i))
            daysThisYear += 1;
    }
    totalSeconds += daysThisYear * SECONDS_PER_DAY;
    return totalSeconds;
}
 
uint32_t TimeMakeComposite(int hour, int minute, int second, int msecond)
{
    return (hour*SECONDS_PER_HOUR + minute*SECONDS_PER_MINUTE + second) * 1000 + msecond;
}
 
/*********************************************************
 * TIME1 - TIME2: msecond
 * @param hour1
 * @param minute1
 * @param second1
 * @param msecond1
 * @param hour2
 * @param minute2
 * @param second2
 * @param msecond2
 * @return
 */
uint32_t TimeGetDiff(int hour1, int minute1, int second1, int msecond1, int hour2, int minute2, int second2, int msecond2)
{
    return (TimeMakeComposite(hour1, minute1, second1, msecond1) + SECONDS_PER_DAY * 1000 -
            TimeMakeComposite(hour2, minute2, second2, msecond2)) % (SECONDS_PER_DAY * 1000);
}