Tìm kiếm chuỗi trong chuỗi được hỗ trợ rất tốt trong .NET nhưng bạn làm gì khi dữ liệu bạn cần tìm kiếm không phải là chuỗi?Tìm kiếm byte []
Tôi có dữ liệu nhị phân đến các khối thông thường thông qua NetworkStream. Các gói là nhị phân nhưng tất cả chúng đều bắt đầu bằng một chuỗi ký tự các byte. Tôi tích lũy các khối thành một bộ đệm lớn hơn và tìm chữ ký bắt đầu của gói.
Điều tôi thực sự tìm kiếm là byte[]
tương đương với phương pháp String.IndexOf(ss)
. Tôi có một cảm giác khó chịu, tôi sẽ phải thực hiện điều này bản thân mình với một vòng lặp và một máy nhà nước.
Mọi đề xuất? Cho bạn!
Như đã đề xuất, Array.IndexOf (byte) sẽ ít nhất là lưu cho tôi một vòng lặp rõ ràng. Kể từ khi đăng bài, nó xảy ra với tôi để tìm byte chữ ký đầu tiên, sau đó thăm dò trước cho một trận đấu mà byte chữ ký cuối cùng nên, sau đó nếu cả hai trận đấu thử một so sánh brute-force cho phần còn lại của chuỗi. Cách tiếp cận này có lợi thế là từ chối các kết quả phù hợp với giá rẻ và cho phép tôi từ chối một cách rẻ tiền khi tôi có một chữ ký một phần đang chờ xử lý một đoạn khác.
Google tiết lộ rằng kế hoạch tuyệt vời ở trên là một trường hợp thoái hóa của thuật toán "KMP" hoặc Knuth-Morris-Pratt. Về mặt tươi sáng, nếu Knuth đặt tên của anh ta trên đó, nó có lẽ là sét bị sét, về mặt nhược điểm, tại sao nó lại bất cứ khi nào tôi có một ý tưởng hay Donald Knuth nghĩ về nó 25 năm trước?
Vì tôi không thể trao điểm cho Donald Knuth Tôi đoán họ sẽ đến Nelson.
Tôi không thể viết giao thức, tôi đang nói đến phần cứng cũ. Tôi có thể viết phiên bản tiếp theo và tôi đã chỉ định chính xác đề xuất của bạn. –