Отображать строку с неправильно закодированными символами как "?"C # - PullRequest
0 голосов
/ 24 января 2019

В настоящее время я работаю над заданием, в котором меня попросили воссоздать просмотрщик памяти в visualstudio как отдельную программу.

Проблема, с которой я столкнулся, заключается в том, что Visual Studio использует какую-то нестандартную кодировку с расширенным набором символов ascii (которого нет в стандартном классе Encoding в C #).

Если я печатаю строку в консоли, некоторые символы представляются как «?». Это нормально и считается ненужным, проблема в том, что всякий раз, когда я помещаю строку sxaid в список для отображения, она отфильтровывает любое "?" и просто прямо удаляет их. Есть ли способ, которым я могу как-то убедиться, что либо он отображает "?" или что я могу исправить кодировку?

Вот несколько скриншотов из VS и моей программы, а также вывод консоли

VS

Visual Studio

Моя программа

My program

Консольный вывод

Console Output

РЕДАКТИРОВАТЬ: Woops я забыл опубликовать код ...

        public unsafe void FillForm(IntPtr startAddress)
    {
        listBox1.Items.Clear();
        listBox2.Items.Clear();
        listBox3.Items.Clear();

        ReadMemory read = new ReadMemory();

        List<MemoryModel> memoryModels = new List<MemoryModel>();

        byte[] mem = read.ReadAddress(startAddress, DisplaySize);
        char[] memChars = new char[mem.Length];

        //dataGridView1.Columns.Add("0", "Address");
        for (int i = 0; i < DisplaySize; i++)
        {
            //dataGridView2.Columns.Add(i.ToString(), i.ToString());
            //dataGridView3.Columns.Add(i.ToString(), i.ToString());
        }
        for (int i = 0; i < DisplaySize; i++)
        {
            //listBox2.Items.Add();
            //dataGridView3.Rows.Add();
            listBox1.Items.Add("0x" + (startAddress + DisplaySize * i).ToString("X8"));
            //dataGridView1[0, i].Value = 

            MemoryModel model = new MemoryModel();


            for (int j = 0; j < DisplaySize; j++)
            {
                //memChars[j] = mem[j] == 255 || mem[j] == 127 || mem[j] < 33 ? '.' : (char)mem[j];
                memChars[j] = mem[j] == 255 || mem[j] == 127 || mem[j] < 33 || ((char)mem[j]).ToString().Contains("\\u")? '.' : (char)mem[j];

                Console.WriteLine(memChars[j] + " + " + mem[j]);
                model.ByteStringAccordingToSize += mem[j].ToString("X2") + " ";
            }


            //convert to model
            model.CharRepresentation = new string(memChars);


            model.FirstByteAddress = "0x" + (startAddress + DisplaySize * i).ToString("X10");

            Console.WriteLine("============ \n ROW: " + i);
            Console.WriteLine(model.CharRepresentation);
            Console.WriteLine("============");

            memoryModels.Add(model);

            mem = read.ReadAddress(startAddress + DisplaySize * (i + 1), DisplaySize);
        }

        foreach (var memoryModel in memoryModels)
        {
            listBox2.Items.Add(memoryModel.ByteStringAccordingToSize);
            listBox3.Items.Add(memoryModel.CharRepresentation);

        }
    }
...