2010-02-26 21 views
5

Tôi cần phải phân tích cú pháp byte từ tệp để tôi chỉ lấy dữ liệu sau khi một chuỗi byte nhất định được xác định. Ví dụ, nếu trình tự đơn giản là 0xFF (một byte), sau đó tôi có thể sử dụng LINQ trên bộ sưu tập:Cách xác định chuỗi các giá trị (cụ thể là byte) trong bộ sưu tập lớn hơn trong .NET

byte[] allBytes = new byte[] {0x00, 0xFF, 0x01}; 
var importantBytes = allBytes.SkipWhile(byte b => b != 0xFF); 
// importantBytes = {0xFF, 0x01} 

Nhưng có một cách thanh lịch để phát hiện một chuỗi đa byte - ví dụ 0xFF, 0xFF - đặc biệt là một bản nhạc trong trường hợp nó bắt đầu nhận được một kết quả dương tính giả?

Trả lời

1

Tôi không biết bất kỳ cách tích hợp nào; như thường lệ, bạn luôn có thể viết phương thức mở rộng của riêng mình. Đây là một trong những đỉnh đầu của tôi (có thể có những cách hiệu quả hơn để thực hiện nó):

public static IEnumerable<T> AfterSequence<T>(this IEnumerable<T> source, 
    T[] sequence) 
{ 
    bool sequenceFound = false; 
    Queue<T> currentSequence = new Queue<T>(sequence.Length); 
    foreach (T item in source) 
    { 
     if (sequenceFound) 
     { 
      yield return item; 
     } 
     else 
     { 
      currentSequence.Enqueue(item); 

      if (currentSequence.Count < sequence.Length) 
       continue; 

      if (currentSequence.Count > sequence.Length) 
       currentSequence.Dequeue(); 

      if (currentSequence.SequenceEqual(sequence)) 
       sequenceFound = true; 
     } 
    } 
} 

Tôi sẽ kiểm tra để đảm bảo rằng điều này là đúng, nhưng nó sẽ cung cấp cho bạn ý tưởng cơ bản; lặp qua các phần tử, theo dõi chuỗi giá trị cuối cùng được truy xuất, đặt cờ khi chuỗi được tìm thấy và khi cờ được đặt, hãy bắt đầu trả về từng phần tử tiếp theo.

Chỉnh sửa - Tôi đã chạy thử nghiệm và hoạt động chính xác. Dưới đây là một số mã thử nghiệm:

static void Main(string[] args) 
{ 
    byte[] data = new byte[] 
    { 
     0x01, 0x02, 0x03, 0x04, 0x05, 
     0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA 
    }; 
    byte[] sequence = new byte[] { 0x02, 0x03, 0x04, 0x05 }; 
    foreach (byte b in data.AfterSequence(sequence)) 
    { 
     Console.WriteLine(b); 
    } 
    Console.ReadLine(); 
} 
1

Nếu bạn chuyển đổi byte thành chuỗi, bạn có thể tận dụng vô số chức năng tìm kiếm được tích hợp sẵn, ngay cả khi các byte bạn đang làm việc không thực sự là các ký tự theo nghĩa truyền thống.

+0

bạn sẽ không phải lo lắng về những gì NET có thể giả định về mã hóa và như vậy mà sẽ cho kết quả sai? – thelsdj

+0

Tôi tin rằng nếu bạn đang tìm kiếm một chuỗi byte chính xác, mã hóa sẽ không thực sự quan trọng (miễn là cả nguồn và chuỗi tìm kiếm đều nằm trong cùng một mã hóa). Bạn có thể sử dụng lớp ASCIIEncoding để giúp chuyển đổi qua lại. – MikeP

0

Cũng như một chút lý thuyết; đây là một vấn đề ngôn ngữ thông thường. Bạn có thể sử dụng một công cụ biểu thức chính quy để phát hiện nó. Google đầu tiên nhấn cho "biểu thức chính quy vào hoạt động" được tìm thấy

http://codeguru.earthweb.com/columns/experts/article.php/c14689

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