如何通过前导读取C前导中的Bin文件

问题描述 投票:0回答:1

例如,我有一个bin文件,并且该文件中有许多消息,我知道msg开头的前两个字节是0x43和0x78,例如msg看起来像CxdjjdjdjdjdjdjdeiCxejejejejdjdclCxejdjdd如何阅读按序阅读序言我想这样读1. Cxdjjdjdjdjdjdjdei2. Cxejejejejdjdcl3. Cxejdjdd

文件不是小文件,而是大文件。我想按味精选择味精,然后逐字节读取,然后将字节解析为库函数,并检查此味精的结果,然后读取下一个,并重复每个味精的所有操作。我知道味精不大于1400字节

c bin
1个回答
0
投票
由于消息很短,我将使用缓冲读取(fread)以利用标准库缓冲的优势

C实现的基础:

const char preamble[] = {0x43, 0x78}; char buffer[2048]; size_t sz = fread(buffer, 1, sizeof(buffer), fd); char *msg_start = NULL; // no start of message char *search_start = buffer; size_t search_size = sz; for(;;) { char *end = memchr(search_start, preamble[0], search_sz); if (end == NULL) { end = buffer + sz; } if ((end < buffer + sz - sizeof(preamble)) && memcmp(end, preamble, sizeof(preamble)) != 0) { size_t delta = end - search_start + 1; search_sz -= delta; search_start += delta; if (search_sz > sizeof(preamble)) continue; end = buffer + sz; } if (msg_start != NULL) { // process the message between msg_start and end } if (end == buffer + sz) break; for (char *dest = buffer, char *src = end; src < end; src++, end++) *dest = *src; size_t delta =fread(buffer + sz, 1, sizeof(buffer) + sz, fd); if (delta == 0) break; sz += delta search_start = msg_start = buffer + sizeof(preamble); }

注意:未经测试,可能包含错字或错误的代码...
© www.soinside.com 2019 - 2024. All rights reserved.