Tôi có một mảng byte mà tôi đang đọc từ một NetworkStream. Hai byte đầu tiên cho biết chiều dài của gói tin sau và sau đó gói được đọc vào một mảng byte có độ dài đó. Dữ liệu mà tôi cần đọc từ mảng NetworkStream/byte có một vài Chuỗi, tức là dữ liệu độ dài biến được kết thúc bởi các ký tự dòng mới và một số trường có chiều rộng cố định như byte và độ dài. Vì vậy, một cái gì đó như thế này:Đọc dòng từ mảng byte (không chuyển đổi mảng byte thành chuỗi)
// I would have delimited these for clarity but I didn't want
// to imply that the stream was delimited because it's not.
StringbyteStringStringbytebytebytelonglongbytelonglong
tôi biết (và có tiếng nói trong) định dạng của các gói dữ liệu được sắp qua, và những gì tôi cần làm là đọc một "dòng" cho mỗi chuỗi giá trị, nhưng đọc số byte cố định cho các byte và thời lượng. Cho đến nay, giải pháp được đề xuất của tôi là sử dụng vòng lặp while
để đọc các byte thành một mảng byte tạm thời cho đến khi có một ký tự dòng mới. Sau đó, chuyển đổi các byte thành một chuỗi. Điều này có vẻ kludgy với tôi, nhưng tôi không thấy một cách rõ ràng. Tôi nhận ra tôi có thể sử dụng StreamReader.ReadLine()
nhưng điều đó sẽ liên quan đến một luồng khác và tôi đã có một NetworkStream
. Nhưng nếu đó là giải pháp tốt hơn, tôi sẽ cho nó một shot. Một tùy chọn khác mà tôi đã xem xét là để nhóm phụ trợ của tôi viết một hoặc hai byte cho độ dài của các giá trị String đó để tôi có thể đọc được độ dài và sau đó đọc Chuỗi dựa trên độ dài được chỉ định. Vì vậy, như bạn có thể thấy, tôi có một số tùy chọn để tìm hiểu về điều này và tôi muốn ý kiến của bạn về những gì bạn sẽ xem là cách tốt nhất để thực hiện điều đó. Đây là mã mà tôi có ngay bây giờ để đọc trong toàn bộ gói dưới dạng chuỗi. Bước tiếp theo là phá vỡ các lĩnh vực khác nhau của gói và thực hiện công việc lập trình thực tế cần được thực hiện, tạo đối tượng, cập nhật giao diện người dùng, vv dựa trên dữ liệu trong gói.
string line = null;
while (stream.DataAvailable)
{
//Get the packet length;
UInt16 packetLength = 0;
header = new byte[2];
stream.Read(header, 0, 2);
// Need to reverse the header array for BitConverter class if architecture is little endian.
if (BitConverter.IsLittleEndian)
Array.Reverse(header);
packetLength = BitConverter.ToUInt16(header,0);
buffer = new byte[packetLength];
stream.Read(buffer, 0, BitConverter.ToUInt16(header, 0));
line = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
Console.WriteLine(line);
}
Chưa từng gặp BinaryReader trước đây. Có vẻ như nó sẽ vô cùng hữu ích cho tất cả những thứ tôi đang làm. Cảm ơn! – jxpx777
Yah, BinaryReader không hoạt động đối với chúng tôi vì dữ liệu đang được ghi vào luồng bởi ứng dụng Java. Tôi đã kết thúc "brute buộc" nó bằng cách đọc trong mảng byte và sau đó nguyền rủa thông qua nó dựa trên cấu trúc gói dữ liệu của chúng tôi. – jxpx777