匹配二进制流中的字符串

来源:互联网 发布:博世华域武汉待遇知乎 编辑:程序博客网 时间:2024/06/05 15:36

代码来自VikingCAT的Segmar模块

C版本

#define MAX_BLKSZ 262144 // 256k#define MAGIC_TAG "METAM3U8"#define MAGIC_TAG_LEN 8struct 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




原创粉丝点击