Tôi có một bộ đệm có độ dài 256 nhận chuỗi byte từ bluetooth. Gói thực tế mà tôi cần trích xuất là bắt đầu và kết thúc với byte 126
. Tôi muốn trích xuất các gói tin mới nhất trong bộ đệm bằng cách sử dụng LINQ.Trích xuất gói dữ liệu ra khỏi bộ đệm byte
Điều tôi đang làm bây giờ là kiểm tra chỉ mục cuối cùng của 126
và sau đó đếm ngược cho đến khi tôi đạt đến một số 126
khác. Có một số cạm bẫy là tốt, ví dụ, hai gói liền kề có thể dẫn đến hai byte của 126
cạnh nhau.
Đây là một mẫu của bộ đệm:
126 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0
Vì vậy, thông tin mà tôi có là:
- gói bắt đầu và kết thúc với giá trị byte của 126
- byte tiếp theo sau khi chỉ số bắt đầu có giá trị 69
- 3 byte cuối cùng bên phải cho byte kết thúc là 126 là CRC của toàn bộ gói mà tôi biết cách tính, vì vậy sau khi trích xuất một gói tôi có thể hãy xem CRC này để xem tôi có đúng gói
Vì vậy, ở cuối tôi muốn có một mảng hoặc danh sách chứa gói chính xác. ví dụ:
126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126
Bạn có thể cho tôi một cách nhanh chóng giải nén gói này từ bộ đệm không?
Đây là những gì I'v cố gắng cho đến nay .... nó không thành công vì nó không thể thực sự trở lại với gói đúng Tôi đang tìm kiếm:
var data = ((byte[])msg.Obj).ToList(); //data is the buffer
byte del = 126; //delimeter or start/end byte
var lastIndex = data.LastIndexOf(del);
var startIndex = 0;
List<byte> tos = new List<byte>(); //a new list to store the result (packet)
//try to figure out start index
if(data[lastIndex - 1] != del)
{
for(int i = lastIndex; i > 0; i--)
{
if(data[i] == del)
{
startIndex = i;
}
}
//add the result in another list
for(int i = 0; i <= lastIndex - startIndex; i++)
{
tos.Add(data[i]);
}
string shit = string.Empty;
foreach (var b in tos)
shit += (int)b + ", ";
//print result in a textbox
AddTextToLogTextView(shit + "\r\n");
}
@KendallFrey tôi 'v đã thêm của riêng tôi cách tiếp cận, nó dường như không tìm thấy chỉ số bắt đầu và kết thúc thực sự của một gói chính xác: ( –
Bạn có thể giải thích logic của mình không? – ehudt
Có thể có kết quả một phần bộ đệm này không? Tôi có nghĩa là các byte bắt đầu được gửi nhưng cho đến khi kết thúc của bộ đệm không có điểm đánh dấu kết thúc bởi vì nó là một phần của một phản ứng lớn hơn? Trong trường hợp này, bất kỳ giải pháp nào được trình bày bên dưới đều sai. –