سؤال

لدي الكود التالي:

using (BinaryReader br = new BinaryReader(
       File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
    int pos = 0;
    int length = (int) br.BaseStream.Length;

    while (pos < length)
    {
        b[pos] = br.ReadByte();
        pos++;
    }

    pos = 0;
    while (pos < length)
    {
        Console.WriteLine(Convert.ToString(b[pos]));
        pos++;
    }
}

File_Path هي سلسلة const التي تحتوي على المسار إلى الملف الثنائي. الملف الثنائي هو مزيج من الأعداد الصحيحة والشخصيات. الأعداد الصحيحة هي 1 بايت لكل حرف وكل حرف مكتوب إلى الملف ك 2 بايت.

على سبيل المثال، يحتوي الملف على البيانات التالية:

1 hello كيف هي you45you تبدو رائعة // وهلم جرا

يرجى ملاحظة: يرتبط كل عدد صحيح بسلسلة الأحرف التالية. لذا 1 يرتبط ب "مرحبا كيف حالك" و 45 مع "تبدو رائعة" وهكذا.

الآن مكتوب الثنائي (لا أعرف لماذا، لكن يجب أن أعيش مع هذا) بحيث ستستغرق "1" فقط 1 بايت بينما يأخذ "H" (والأحرف الأخرى) 2 بايت لكل منهما.

لذلك هنا هو ما يحتوي الملف بالفعل على:

0100480045.. وفي هيريس انهيار:

01 هو البايت الأول لعدد صحيح 1 0048 هي 2 بايت ل 'H' (H'S 48 في عرافة) 0045 هي 2 بايت ل 'E' (E = 0x45)

وهكذا .. أريد وحدة التحكم الخاصة بي بطباعة تنسيق قابل للقراءة بشري من هذا الملف: أنني أريد ذلك طباعة "1 مرحبا كيف حالك" ثم "45 أنت تبدو رائعة" وهكذا ...

هل ما أقوم به؟ هل هناك طريقة أسهل / فعالة؟ My Line Console.Writeline (Convert.ToString (B [POS]))؛ لا يفعل شيئا سوى طباعة القيمة الصحيحة وليس الشخصية الفعلية التي أريدها. كل شيء على ما يرام للأعداد الصحيحة في الملف ولكن بعد ذلك كيف أقرأ الأحرف؟

أي مساعدة سيكون محل تقدير كبير. شكرًا

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

المحلول

أعتقد أن ما تبحث عنه هو encoding.getstring..

نظرا لأن بيانات السلسلة تتكون من شخصيات بايت 2، كيف يمكنك الحصول على سلسلة الخاص بك هي:

for (int i = 0; i < b.Length; i++)
{
  byte curByte = b[i];

  // Assuming that the first byte of a 2-byte character sequence will be 0
  if (curByte != 0)
  { 
    // This is a 1 byte number
    Console.WriteLine(Convert.ToString(curByte));
  }
  else
  { 
    // This is a 2 byte character. Print it out.
    Console.WriteLine(Encoding.Unicode.GetString(b, i, 2));

    // We consumed the next character as well, no need to deal with it
    //  in the next round of the loop.
    i++;
  }
}

نصائح أخرى

يمكنك استخدام String System.Text.unicodeEncoding.getString () التي تأخذ صفيف بايت [] وتنتج سلسلة.

لقد وجدت هذا الرابط مفيد جدا

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

using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{    
   int length = (int)br.BaseStream.Length;    

   byte[] buffer = new byte[length * 2];
   int bufferPosition = 0;

   while (pos < length)    
   {        
       byte b = br.ReadByte();        
       if(b < 10)
       {
          buffer[bufferPosition] = 0;
          buffer[bufferPosition + 1] = b + 0x30;
          pos++;
       }
       else
       {
          buffer[bufferPosition] = b;
          buffer[bufferPosition + 1] = br.ReadByte();
          pos += 2;
       }
       bufferPosition += 2;       
   }    

   Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition));

}

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