-
Notifications
You must be signed in to change notification settings - Fork 0
/
buf.c
140 lines (117 loc) · 3.1 KB
/
buf.c
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
#include "buf.h"
#include <string.h>
#include <stdio.h>
char g_buf[BUF_MAX_LEN] = {0};
G_BUF_INDEX g_buf_index = {0, 0};
void buf_init()
{
g_buf_index.front = 0;
g_buf_index.rear = 0;
}
int buf_used_len()
{
return (g_buf_index.rear - g_buf_index.front + BUF_MAX_LEN) % BUF_MAX_LEN;
}
int buf_unused_len()
{
return BUF_MAX_LEN - 1 - buf_used_len();
}
int buf_is_empty()
{
return g_buf_index.front == g_buf_index.rear ? 1 : 0;
}
int buf_is_full(int frame_len)
{
return frame_len + 4 > buf_unused_len() ? 1 : 0;
}
void buf_push_back(FILE *fp, int frame_len)
{
if (buf_is_full(frame_len))
{
return;
}
char frame_len_buf[4] = {0};
int i = 0;
int fir_len = 0;
int sec_len = 0;
/* 放入frame_len 以及 fp读出的frame_len长度的数据 */
for (i = 0; i < 4; i++)
{
frame_len_buf[i] = (frame_len >> (i * 8)) & 0xff;
}
if (g_buf_index.rear + 4 > BUF_MAX_LEN)
{
fir_len = BUF_MAX_LEN - g_buf_index.rear;
sec_len = 4 - fir_len;
memcpy(g_buf + g_buf_index.rear, frame_len_buf, fir_len);
memcpy(g_buf, frame_len_buf+fir_len, sec_len);
}
else
{
memcpy(g_buf+g_buf_index.rear, frame_len_buf, 4);
}
g_buf_index.rear = (g_buf_index.rear + 4) % BUF_MAX_LEN;
/* 判断 */
if (g_buf_index.rear + frame_len > BUF_MAX_LEN)
{
fir_len = BUF_MAX_LEN - g_buf_index.rear;
sec_len = frame_len - fir_len;
fread(g_buf + g_buf_index.rear, 1, fir_len, fp);
fread(g_buf, 1, sec_len, fp);
}
else
{
fread(g_buf + g_buf_index.rear, 1, frame_len, fp);
}
g_buf_index.rear = (g_buf_index.rear + frame_len) % BUF_MAX_LEN;
}
int buf_pop_front_frame_len()
{
if (buf_is_empty())
{
return 0;
}
int frame_len = 0;
char frame_len_buf[4] = {0};
int i = 0;
int fir_len = 0;
int sec_len = 0;
/* 解析长度*/
/* 判断 */
if (g_buf_index.front + 4 > BUF_MAX_LEN)
{
fir_len = BUF_MAX_LEN - g_buf_index.front;
sec_len = 4 - fir_len;
memcpy(frame_len_buf, g_buf + g_buf_index.front, fir_len);
memcpy(frame_len_buf+fir_len, g_buf, sec_len);
}
else
{
memcpy(frame_len_buf, g_buf + g_buf_index.front, 4);
}
g_buf_index.front = (g_buf_index.front + 4) % BUF_MAX_LEN;
for (i = 0; i < 4; i++)
{
frame_len |= ((frame_len_buf[i] << (i * 8)) & (0xff << (i * 8)));
}
return frame_len;
}
void buf_pop_front_frame_value(int frame_len, char *tmp_frame_value_buf)
{
int fir_len = 0;
int sec_len = 0;
/* 判断 */
/* 将帧数据读入tmp_frame_value_buf */
if (g_buf_index.front + frame_len > BUF_MAX_LEN)
{
fir_len = BUF_MAX_LEN - g_buf_index.front;
sec_len = frame_len - fir_len;
memcpy(tmp_frame_value_buf, g_buf + g_buf_index.front, fir_len);
memcpy(tmp_frame_value_buf + fir_len, g_buf, sec_len);
}
else
{
memcpy(tmp_frame_value_buf, g_buf + g_buf_index.front, frame_len);
}
g_buf_index.front = (g_buf_index.front + frame_len) % BUF_MAX_LEN;
}