الفرق في كتابة السلسلة مقابل.صفيف شار مع System.IO.BinaryWriter
-
06-07-2019 - |
سؤال
أنا أكتب نصًا إلى ملف ثنائي في 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);
}
هل نظرتم الى ما كتبه في الواقع؟ كنت اعتقد فاصل فارغة.