2011-09-25 26 views
5

thể trùng lặp:
byte[] array pattern searchxác định xem mảng byte chứa byte theo một thứ tự cụ thể

Hãy nói rằng tôi có một mảng byte:

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

thế nào có thể Tôi xác định xem myArray có chứa byte 9,3,4,3 theo thứ tự đó không? thế nào để tôi phải lặp qua mảng thêm mỗi phần tử vào một chuỗi sau đó sử dụng phương thức String.Contains() để biết liệu mảng byte đó có chứa các phần tử đó theo thứ tự đó không?

Tôi biết tôi có thể làm semething như:

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

//then do 

s.Contains("9343") 

này không phải là để có hiệu quả trên các mảng dài. Điều gì sẽ là một cách hiệu quả hơn để làm điều này?

+0

nếu bạn đang nghĩ đến việc thực hiện một chuỗi để làm một Chứa: chuỗi myString = System.Text.Encoding.ASCII.GetString (myByteArray) nhưng chờ đợi một câu trả lời thích hợp ;-) – gordatron

+0

Tôi không cần phải chuyển đổi nó vào một chuỗi. Tôi chỉ sử dụng một chuỗi vì đó là phương pháp duy nhất mà tôi biết điều đó sẽ cho phép tôi thực hiện loại so sánh đó. đó là hữu ích mặc dù cảm ơn rất nhiều –

+0

đúng có một câu hỏi tương tự xin lỗi tôi đã không tìm thấy nó. –

Trả lời

8

Hãy thử như sau

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

Trong thử nghiệm nhanh chóng của tôi, điều này đã bị tắt bởi một lỗi. Nếu dữ liệu tìm thấy là các phần tử cuối cùng trong mảng, nó sẽ thoát khỏi vòng lặp sớm. Tôi sẽ thực hiện thử nghiệm thêm một chút để xác minh điều này và đăng câu trả lời, nhưng bây giờ về cơ bản nó sẽ gọi điều kiện vòng đầu tiên tới '<=' – CubanX

1

Thuật toán đơn giản nhất mà làm việc và bị xé rách qua các mảng byte cho đến khi bạn tìm thấy một trận đấu trên byte đầu tiên trong mô hình byte mà bạn đang tìm kiếm sau đó đi bộ dọc qua hai cho đến khi bạn đạt đến kết thúc, hoặc nếu bạn tìm thấy một sự không phù hợp, tiếp tục từ nơi bạn rời đi. Điều này có thể "làm suy giảm" nếu bạn tiếp tục nhận được kết quả khớp một phần. Tùy thuộc vào nhu cầu của bạn, điều này có thể đủ tốt (nó đơn giản để viết, đơn giản để duy trì).

Nếu điều đó không đủ nhanh cho mục đích của bạn, bạn có thể dễ dàng áp dụng Boyer-Moore.

Các vấn đề liên quan