2011-09-25 20 views
5

Olası Çoğalt:
byte[] array pattern searchbelirlemek

ı bayt dizisi var diyelim:

byte[] myArray = new byte[]{1,2,3,4,5,6,7,1,9,3,4,3,4,7,6,5,6,7,8}; 

nasıl olabilir MyArray'ın bu sırayla 9,3,4,3 bayt içerip içermediğini belirler miyim? her bir öğeyi bir dizeye ekleyen dizi boyunca yinelemek zorundayım, o bayt dizisinin bu sırayla bu öğeleri içerip içermediğini öğrenmek için String.Contains() yöntemini kullanın.

ben gibi semething yapabileceğini biliyorum: bu uzun diziler üzerinde etkili değildir

String s = ""; 
foreach(byte b in myArray) 
{ 
    s = s + b.ToString(); 
} 

//then do 

s.Contains("9343") 

. Bunu yapmanın daha verimli bir yolu ne olacak?

+0

bir İçeren: string myString = System.Text.Encoding.ASCII.GetString (myByteArray) ama uygun bir cevap ;-) Ben dönüştürmek gerekmez – gordatron

+0

beklemek bir dizeye. Sadece bir dize kullandım çünkü bildiğim tek yöntem bu karşılaştırmayı yapmamı sağlayacak. Bu yararlı olsa da bir çok –

+0

teşekkürler çünkü ben bulamadım üzgünüm benzer bir soru var. –

cevap

8

çalışır ve daha sonra içinden boyunca yürüyerek aradığınız bayt desende ilk byte bir maç bulana kadar bayt dizisi aracılığıyla rip için aşağıdaki

public static bool ContainsSequence(byte[] toSearch, byte[] toFind) { 
    for (var i = 0; i + toFind.Length < toSearch.Length; i++) { 
    var allSame = true; 
    for (var j = 0; j < toFind.Length; j++) { 
     if (toSearch[i + j] != toFind[j]) { 
     allSame = false; 
     break; 
     } 
    } 

    if (allSame) { 
     return true; 
    } 
    } 

    return false; 
} 
+0

Hızlı testimde, bu bir hatayla bir hata yaptı. Bululacak veriler dizideki son öğelerdeyse, döngüden erken çıktı. Bunu doğrulamak ve cevabı göndermek için biraz daha fazla test yapacağım, ancak şimdilik temelde ilk döngü koşulunu '<= ' – CubanX

1

en basit algoritma deneyin Sonuna ulaşana kadar iki, ya da bir uyumsuzluk bulursanız, bıraktığınız yerden devam edin. Kısmi eşleşmeler almaya devam ederseniz bu "bozulabilir". İhtiyaçlarınıza bağlı olarak, bu yeterince iyi olabilir (yazmak basit, bakımı basittir).

Amaçlarınız için yeterince hızlı değilse, kolayca Boyer-Moore kabul edebilirsiniz. senin yapmak için bir dize yapma düşünüyorsun

İlgili konular