2010-11-24 7 views
6

ile başlamak için önemsiz olur Burada neyi yanlış yaptığımı anlamaya çalışıyorum. Bir dilde ilk dört baytı bir veri akışından, verilerin kalanının ne kadar beklendiğini söyleyen bir Int32 değerine getirmeyi kolaylaştırmak için bir Binary Reader kullanmaya çalışıyorum.C# BinaryReader.Read()

static void Main(string[] args) 
{ 
    MemoryStream stream = new MemoryStream(); 

    BinaryWriter writer = new BinaryWriter(stream); 

    string s = "Imagine this is a very very long string."; 

    writer.Write(s.Length); 
    writer.Write(s); 
    writer.Flush(); 

    BinaryReader reader = new BinaryReader(stream); 
    reader.BaseStream.Seek(0, SeekOrigin.Begin); 

    char[] aChars = new char[reader.ReadInt32()]; 
    reader.Read(aChars, 0, aChars.Length); 
    Console.WriteLine(new string(aChars)); 
} 

çıkış giriş olmalı, ama ben bu

(bu çok çok uzun bir dize

olduğunu düşünün (dizeye dizesinden ilk karakter değişiklikleri unutmayın) olsun

Birisi bana neyi yanlış yaptığımı açıklayabilir İdeal olarak, ikinci okuma, toplam okunan baytlar ilk dört bayt değerine eşit olana kadar devam edecektir. Bu kod, karşılaştığım problemi göstermek için sadece bir sadeleştirmedir. Akışın pozisyonu düzeltildi ekt (4) ancak neredeyse 2'de okumaya başlamış gibi gözüküyor.

+0

MSDN, okumak istersiniz. – jason

+0

Hehe, teşekkürler ... ve öyleydim. Ne yazık ki, BinaryReader, Writer’in string’ten daha fazla veri depoladığını belirtmez;) – James

+0

'BinaryWriter.Write (string)': "Uzunluk-öneklenmiş' string', 'string' uzunluğunu önceleyerek' string' uzunluğunu temsil eder. dize, bu dizgenin uzunluğunu içeren tek bir bayt veya kelime. Bu yöntem, ilk olarak "string" in uzunluğunu UTF-7 kodlu imzasız bir tamsayı olarak yazar ve daha sonra bu karakterleri kullanarak akışa birçok karakter yazar. BinaryWriter'ın geçerli kodlaması. " – jason

cevap

8

BinaryWriter.Write(String), bu akışa bir uzunluk-ön eki dizge yazar. Bu, ilk önce dizenin uzunluğunu akışa ve ardından bazı kodlamaları kullanan dizeye yazar. Uzunluk, bir kerede yedi bit olarak kodlanır, 32 bit tam sayı olarak değil.

Akıştan okumak isterseniz, akıştan bir uzunluk öneki dizeyi okuyan BinaryReader.ReadString kullanmalısınız.

+0

Verilerin geri kalanı ilk başta akıntıya sahip değilse otomatik olarak gösterilmesini bekleyecek mi? – James

+0

Sadece uzunluğu değil, uzunluğu 7 bitlik bir kodlamayla yazılır. Dolayısıyla, 128 bayttan daha az olan dizeler, bir baytlık uzunluk önekine vb. Sahiptir. –

+0

@James: Evet, verileri bekler. –