الفرق في كتابة السلسلة مقابل.صفيف شار مع System.IO.BinaryWriter

StackOverflow https://stackoverflow.com/questions/1014727

سؤال

أنا أكتب نصًا إلى ملف ثنائي في C# وأرى اختلافًا في الكمية المكتوبة بين كتابة سلسلة ومجموعة أحرف.أنا أستخدم System.IO.BinaryWriter وأشاهد BinaryWriter.BaseStream.Length أثناء حدوث عمليات الكتابة.هذه هي نتائجي:

using(BinaryWriter bw = new BinaryWriter(File.Open(“data.dat”), Encoding.ASCII))
{
  string value = “Foo”;

  // Writes 4 bytes
  bw.Write(value);

  // Writes 3 bytes 
  bw.Write(value.ToCharArray());
}

لا أفهم لماذا يكتب الحمل الزائد للسلسلة 4 بايت عندما أكتب 3 أحرف ASCII فقط.يمكن لأي شخص أن يفسر هذا؟

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

المحلول

وثائق BinaryWriter.Write(string) تنص أنه يكتب طول مسبوقة سلسلة لهذا التيار. الحمل الزائد لل Write(char[]) لا يوجد لديه مثل هذا التقديم.

ويبدو لي أن بيانات إضافية هو طول.

وتحرير:

ولمجرد أن يكون قليلا أكثر وضوحا، واستخدام العاكس. سترى أن لديها هذه القطعة من التعليمات البرمجية في هناك كجزء من أسلوب Write(string):

this.Write7BitEncodedInt(byteCount);

وهذا هو وسيلة لترميز عدد صحيح باستخدام أقل عدد ممكن من وحدات البايت. سلاسل قصيرة (أننا سوف تستخدم يوما بعد يوم أن أقل من 128 حرفا)، فإنه يمكن أن تكون ممثلة باستخدام بايت واحد. سلاسل أطول، ويبدأ لاستخدام المزيد بايت.

وهنا هو رمز لهذه المهمة فقط في حال كنت مهتما:

protected void Write7BitEncodedInt(int value)
{
    uint num = (uint) value;
    while (num >= 0x80)
    {
        this.Write((byte) (num | 0x80));
        num = num >> 7;
    }
    this.Write((byte) num);
}

وبعد التقديم على طول باستخدام هذا الترميز، فإنه يكتب بايت للشخصيات في الترميز المطلوب.

نصائح أخرى

من BinaryWriter.Write(string) مستندات:

يكتب أ مسبوقة بالطول السلسلة إلى هذا الدفق في التشفير الحالي لـ BinaryWriter، ويتقدم الموضع الحالي للدفق وفقًا للتشفير المستخدم والأحرف المحددة التي تتم كتابتها في الدفق.

من المحتمل أن يكون هذا السلوك هو أنه عند قراءة الملف مرة أخرى باستخدام ملف BinaryReader يمكن التعرف على السلسلة.(على سبيل المثال 3Foo3Bar6Foobar يمكن تحليلها في السلسلة "Foo" و"Bar" و"Foobar" ولكن FooBarFoobar لا يمكن أن يكون.) في الواقع، BinaryReader.ReadString يستخدم بالضبط هذه المعلومات لقراءة string من ملف ثنائي.

من BinaryWriter.Write(char[]) مستندات:

يكتب مصفوفة أحرف إلى الدفق الحالي ويتقدم بالموضع الحالي للدفق وفقًا للتشفير المستخدم والأحرف المحددة التي تتم كتابتها في الدفق.

من الصعب المبالغة في تقدير مدى شمولية وفائدة المستندات الموجودة على MSDN.تحقق منها دائمًا أولاً.

وكما ذكر سابقا، BinaryWriter.Write (سلسلة) كتب طول السلسلة إلى تيار، قبل كتابة السلسلة نفسها.

وهذا يسمح للBinaryReader.ReadString () لأعرف كم من الوقت السلسلة.

using (BinaryReader br = new BinaryReader(File.OpenRead("data.dat")))
{
    string foo1 = br.ReadString();
    char[] foo2 = br.ReadChars(3);
}

هل نظرتم الى ما كتبه في الواقع؟ كنت اعتقد فاصل فارغة.

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