سؤال

أحاول معرفة ما أفعله خطأ هنا. أحاول استخدام قارئ ثنائي لتخفيف الحصول على أربعة بايت أولية من دفق إلى قيمة int32 تخبرني كم من الوقت متوقع بقية البيانات.

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));
}

يجب أن يكون الإخراج هو الإدخال ، لكنني أحصل على هذا (لاحظ أن الحرف الأول يتغير من سلسلة إلى سلسلة)

(تخيل أن هذه سلسلة طويلة جدًا

هل يمكن لأحد أن يشرح لي ما أفعله خطأ؟ من الناحية المثالية ، ستستمر القراءة الثانية حتى كانت بايت القراءة الكلية مساوية لقيمة البايتات الأربعة الأولى .. هذا الرمز هو مجرد تبسيط لإظهار المشكلة التي أديرها. يبدو موضع الدفق صحيحًا (4) ولكن يبدو أنه يبدأ في القراءة في 2.

هل كانت مفيدة؟

المحلول

BinaryWriter.write (سلسلة) يكتب سلسلة الطول المتراجع إلى هذا الدفق. هذا يعني أنه يكتب أولاً طول السلسلة إلى الدفق ، ثم السلسلة باستخدام بعض الترميز. يتم تشفير الطول سبعة بت في وقت واحد ، وليس كمكتسب 32 بت.

إذا كنت ترغب في القراءة من الدفق ، فيجب عليك استخدامها BinaryReader.ReadString, ، الذي يقرأ سلسلة طول المندوب من الدفق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top