В настоящее время я работаю над заданием, в котором меня попросили воссоздать просмотрщик памяти в visualstudio как отдельную программу.
Проблема, с которой я столкнулся, заключается в том, что Visual Studio использует какую-то нестандартную кодировку с расширенным набором символов ascii (которого нет в стандартном классе Encoding в C #).
Если я печатаю строку в консоли, некоторые символы представляются как «?». Это нормально и считается ненужным, проблема в том, что всякий раз, когда я помещаю строку sxaid в список для отображения, она отфильтровывает любое "?" и просто прямо удаляет их. Есть ли способ, которым я могу как-то убедиться, что либо он отображает "?" или что я могу исправить кодировку?
Вот несколько скриншотов из VS и моей программы, а также вывод консоли
VS
Моя программа
Консольный вывод
РЕДАКТИРОВАТЬ: 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);
}
}