سؤال

في هذه المرحلة، سيكون معظم الناس يفكرون "آه مرساة هذا ..:

byte[] dataB= System.Text.Encoding.ASCII.GetBytes(data);

ومع ذلك .. المشكلة التي أحتاجها هي أنني بحاجة إلى القيمة الدقيقة للبايت مع أي ترميز فقط القيمة الخالصة لكل بايت. على سبيل المثال، إذا كانت قيمة السلسلة (0XFF32) أريدها تحويلها أيضا {255،50}. هو السبب لهذا هو أن لدي تنسيق ملف أحاول أن أقرأ المخازن التي يحفظها bytes ثم يقرأها عند فتح البرنامج.

هذا ما لدي حتى الآن:

...
dialog.InitialDirectory =
    Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) +
    "/Test";

dialog.Title="Open File";

if (dialog.ShowDialog(this) == DialogResult.OK)
{
    StreamReader reader = new StreamReader(dialog.FileName);
    string data = reader.ReadToEnd();
    reader.Close();
    byte[] fileC = System.Text.Encoding.ASCII.GetBytes(data);
    File_Read(dialog.FileName,fileC);
}
...

لذلك عندما أحاول وقراءة الملف، فإنه يحول أرصيت الملفات من القول 0xFF إلى 0x3f لأن 0xff أكبر ثم 127 و 0x3f هو؟.

آسف إذا كنت تبدو مربكة بعض الشيء :)

شكرا، مايكل

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

المحلول

المشكلة هي مع نهجك للبدء مع:

أحتاج إلى القيمة الدقيقة للبايت مع أي ترميز

...

على سبيل المثال، إذا كانت قيمة السلسلة (0XFF32)

هذا يشبه قليلا النظر إلى لوحة زيتية وقوله، "أريد البايتات لهذه الصورة، مع عدم وجود ترميز". هذا لا معنى له. النص ليس هو نفسه البيانات الثنائية. بمجرد أن تفهم ذلك، من السهل الوصول إلى جذر المشكلة. ما تريد حقا هو محتويات أ ملف كصفيف بايت. هذا سهل، لأن الملفات هي بيانات ثنائية! يجب أن لا تقرأ ذلك كنص في المقام الأول إذا لم يكن النص حقا. لحسن الحظ، .NET يجعل هذا سهل حقا:

byte[] fileC = File.ReadAllBytes(dialog.FileName);

نصائح أخرى

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

ثم استخدم هذا:

byte[] dataB = System.Text.Encoding.Unicode.GetBytes(data);

أنه بإرجاع البايتات كما تخزين داخليا بواسطة سلاسل .NET.

ولكن كل هذا هو codswallop: سلسلة هي دائما مرتبط بترميز معين وليس هناك طريقة حولها. ستفشل أعلاه، على سبيل المثال إذا كان الملف يحتوي على تسلسل رمز Unicode غير صالح (قد يحدث) أو من خلال التطبيع. لأنك من الواضح أنك لا يريد أ string, ، لا تقرأ واحدة. اقرأ الملف كبيانات ثنائية بدلا من ذلك.

/ / تحويل سلسلة إلى صفيف بايت

public static byte[] StrToByteArray(string str)
{
    System.Text.UTF8Encoding  encoding=new System.Text.UTF8Encoding();
    return encoding.GetBytes(str);
}

/ / تحويل صفيف بايت إلى سلسلة

public string ByteArrayToStr(byte [] dBytes)
{
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
return enc.GetString(dBytes);
}

إستخدم BinaryReader..

لماذا التحويل من سلسلة على الإطلاق؟ لا يمكن أن تقرأ فقط محتويات الملف مباشرة في بايت؟

byte[] fileC = File.ReadAllBytes(dialog.FileName);

إذا كنت تريد بايت، استخدم دفق!

لماذا على الأرض أنت تعبث مع textreader؟

تعديل:

حسب مثالك، تقوم بفتح ملف، لذلك استخدم فقط FileStream.

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