代码来自VikingCAT的Segmar模块
C版本
#define MAX_BLKSZ 262144 // 256k
#define MAGIC_TAG "METAM3U8"
#define MAGIC_TAG_LEN 8
struct header {
uint8_t version;
uint8_t cmd;
char guid[48];
char data[];
};
static int match_tag(int fd, size_t leftsz, size_t *readsz) {
const char *key = MAGIC_TAG;
char buf[MAGIC_TAG_LEN] = { 0 };
int mov, la, lb;
mov = la =lb = MAGIC_TAG_LEN;
size_t count = 0;
int find = 0;
while (count < leftsz) {
int len = MAGIC_TAG_LEN - mov;
if (len > 0) memcpy(buf, buf + mov, len);
int sz = read(fd, buf + len, mov);
count += sz;
if (sz < mov) break;
int i;
for (i = MAGIC_TAG_LEN - 1; i > -1; --i) {
if (key[i] != buf[i]) break;
}
if (i == -1) {
find = 1;
break;
}
char c = buf[i];
int k;
for (k = 0; k < i; ++k) {
if (key[k] == c) break;
}
if (k == i) k = -1;
mov = i - k;
}
*readsz = count;
return find;
}
再来个python版本的
############################################################################
_max_blksz = 256 * 1024 # 256K
_magic_tag = 'METAM3U8'
############################################################################
def match(fd, key, fsize) :
a = key
la = len(key)
lb = la
mov = la
count = mov
d = ''
found = False
while count <= fsize :
r = fd.read(mov)
d = d[mov : ] + r
if len(d) < la :
break
bi = -1
for i in range(la - 1, -1, -1) :
if a[i] != d[i] :
bi = i
break
if bi == -1 :
found = True
break
c = d[bi]
ai = a[0 : bi].find(c)
mov = bi - ai
count += mov
if found :
return True, count - la, count
else :
return False, 0, 0