本文介绍了在流中查找给定字节序列开始位置的最佳方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
您认为在 System.Stream 中查找给定字节序列开始位置(第一次出现)的最佳方法是什么:
How do you think what is the best way to find position in the System.Stream where given byte sequence starts (first occurence):
public static long FindPosition(Stream stream, byte[] byteSequence)
{
long position = -1;
/// ???
return position;
}
附:最简单但最快的解决方案是首选.:)
P.S. The simpliest yet fastest solution is preffered. :)
推荐答案
我已经达到了这个解决方案.
I've reached this solution.
我用 3.050 KB
和 38803 行
的 ASCII 文件做了一些基准测试.在文件的最后一行中搜索 byte
array
of 22 bytes
我得到的结果大约是 2.28代码> 秒(在慢速/旧机器上).
I did some benchmarks with an ASCII file that was 3.050 KB
and 38803 lines
.
With a search byte
array
of 22 bytes
in the last line of the file I've got the result in about 2.28
seconds (in a slow/old machine).
public static long FindPosition(Stream stream, byte[] byteSequence)
{
if (byteSequence.Length > stream.Length)
return -1;
byte[] buffer = new byte[byteSequence.Length];
using (BufferedStream bufStream = new BufferedStream(stream, byteSequence.Length))
{
int i;
while ((i = bufStream.Read(buffer, 0, byteSequence.Length)) == byteSequence.Length)
{
if (byteSequence.SequenceEqual(buffer))
return bufStream.Position - byteSequence.Length;
else
bufStream.Position -= byteSequence.Length - PadLeftSequence(buffer, byteSequence);
}
}
return -1;
}
private static int PadLeftSequence(byte[] bytes, byte[] seqBytes)
{
int i = 1;
while (i < bytes.Length)
{
int n = bytes.Length - i;
byte[] aux1 = new byte[n];
byte[] aux2 = new byte[n];
Array.Copy(bytes, i, aux1, 0, n);
Array.Copy(seqBytes, aux2, n);
if (aux1.SequenceEqual(aux2))
return i;
i++;
}
return i;
}
这篇关于在流中查找给定字节序列开始位置的最佳方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!