问题:有时我们必须将多个流交织成一个,在这种情况下,需要提供一种方法来识别流中的块边界。什么样的格式适合这样的任务?(所有处理都必须是完全连续的,i/o操作是分块和对齐的。)
更新:实际上,我非常肯定,3或5将是我会使用的选项,我只列出了其他选项,希望得到更多的替代(例如,如果冗余是平均每块1位)。所以atm的主要问题是如何解析3的流.当前状态机如下所示:
int saved_c;
int o_last, c_last;
int GetByte( FILE* f ) {
int c;
Start:
if( o_last>=10 ) {
if( c_last>=(o_last-10) ) { c=saved_c; o_last=0; }
else c=byte("\xEC\x4B\xA7"[c_last++]);
} else {
c = getc(f);
if( o_last<3 ) {
if( char(c)==("\xEC\x4B\xA7"[o_last]) ) { o_last++; goto Start; }
else if( o_last>0 ) { saved_c=c; c_last=0; o_last+=10; goto Start; } // 11,12
// else just return c
} else {
if( c>0 ) { c=-1-c, o_last=0; printf( "c=%i\n", c ); }
else { saved_c=0xA7; c_last=0; o_last+=10-1; goto Start; } // 12
}
}
return c;
}当然也很丑(而且很慢)
发布于 2011-03-08 22:48:58
因此,在我的实际项目中,我使用了来自OP的丑陋解析器。
( http://encode.ru/threads/1231-lzma-recompressor )
但现在看来,实际的答案似乎是让数据类型处理程序任意终止其流,这意味着在未压缩数据的情况下可以转义编码,但是当流中使用某种熵编码时,通常可以合并更有效的EOF代码。
发布于 2011-02-28 18:10:15
使用固定大小的块(例如1KB )如何?每个块将包含一个字节(或4个字节),指示它是哪个流,然后它只跟踪数据。
好处:
,
缺点:
如果您必须从流切换到流,且每个流只有几个字节的数据,则
。
发布于 2011-02-28 18:06:11
从顺序读写简单的角度来看,我采用解决方案1,只使用一个限制在256字节的短缓冲区。然后你有一个字节的长度,然后是数据。如果单个流有超过256个连续字节,则只需写出另一个长度头和数据。
如果您有任何进一步的要求,尽管您可能需要做一些更详细的事情。例如,随机访问读取可能需要一个无法在真实数据中复制的神奇数字(或者当它出现在真实数据中时总是转义)。
https://stackoverflow.com/questions/5145558
复制相似问题