2011-06-27 40 views
6

Tôi có tệp văn bản này chứa những trường khác nhau. Một số trường có thể chứa dữ liệu nhị phân. Tôi cần phải nhận được tất cả các dữ liệu trong tập tin nhưng ngay bây giờ khi sử dụng StreamReader thì nó sẽ không đọc khối dữ liệu nhị phân và dữ liệu những gì đến sau đó. Điều gì sẽ là giải pháp tốt nhất để giải quyết vấn đề này?StreamReader và dữ liệu nhị phân

Ví dụ:

field1|field2|some binary data here|field3 

Ngay bây giờ tôi đọc trong file như thế này:

public static string _fileToBuffer(string Filename) 
{ 
    if (!File.Exists(Filename)) throw new ArgumentNullException(Filename, "Template file does not exist"); 

    StreamReader reader = new StreamReader(Filename, Encoding.Default, true); 
    string fileBuffer = reader.ReadToEnd(); 
    reader.Close(); 

    return fileBuffer; 
} 

EDIT: Tôi biết các vị trí bắt đầu và kết thúc của các lĩnh vực nhị phân.

Trả lời

7

StreamReader không được thiết kế cho dữ liệu nhị phân. Nó được thiết kế cho văn bản dữ liệu, đó là lý do tại sao nó mở rộng TextReader. Để đọc dữ liệu nhị phân, bạn nên sử dụng Stream và không cố gắng đưa kết quả vào chuỗi (một lần nữa, đối với dữ liệu văn bản).

Nói chung, bạn nên trộn dữ liệu nhị phân và dữ liệu văn bản vào một tệp như thế này - điều gì sẽ xảy ra nếu dữ liệu nhị phân bao gồm | biểu tượng cho ví dụ? Bạn có thể muốn bao gồm dữ liệu nhị phân trong một số biểu mẫu được mã hóa văn bản, chẳng hạn như biến thể base64 tránh |.

+0

Tôi không có quyền kiểm soát nguồn dữ liệu vì vậy tôi chỉ phải giải quyết nó bằng cách nào đó .. – hs2d

+0

@ hs2d: Vậy điều gì xảy ra nếu dữ liệu nhị phân bao gồm ASCII (hoặc bất kỳ mã hóa nào được sử dụng) đại diện cho '|'? Có điều gì trong hai trường đầu tiên cho bạn biết độ dài mong đợi không? –

+0

không có gì cho tôi biết chiều dài dự kiến. Nhìn vào câu hỏi khác của tôi. Im sử dụng mẫu để lấy dấu phân cách trường đánh dấu phần cuối của một trường: [link] (http://stackoverflow.com/questions/6479505/c-template-parsing-and-matching-with-text-file) – hs2d

9

sử dụng BinaryReader

+0

Và BinaryWriter để ghi tệp theo định dạng nhị phân hợp lý. – Guillaume

+0

Khi tôi sử dụng BinaryReader thì il có được tất cả các trường trong nhị phân, vì vậy tôi nên đi từ đâu để lấy lại các trường không phải là dữ liệu nhị phân dưới dạng chuỗi? – hs2d

+0

@ hs2d StringBuilder + BinaryReader.ReadChar nhưng nếu bạn có thể thay đổi tệp nguồn, hãy sử dụng ReadString. – Guillaume

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