匹配二进制流中的字符串

代码来自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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值