У меня возникли трудности с использованием reinterpret_cast. Давайте просто скажем сразу с места в карьер, что я не женат от reinterpret_cast. Не стесняйтесь предлагать серьезные изменения. Прежде чем я покажу вам свой код, я дам вам знать, что я пытаюсь сделать.Преобразование десятичного разряда в ASCII
Я пытаюсь получить имя файла из вектора, полного данных, используемого процессором MIPS I, который я разработал. В основном, что я делаю, это компиляция двоичного кода из тестовой программы для моего процессора, сбрасывание всех шестнадцатеричных из двоичного кода в вектор в моей программе на C++, преобразование всех этих шестнадцатеричных чисел в десятичные целые числа и сохранение их в векторе DataMemory, который является данными блок памяти для моего процессора. У меня также есть память команд. Поэтому, когда мой процессор запускает инструкцию SYSCALL, такую как «Open File», мой эмулятор операционной системы C++ получает указатель на начало имени файла в моей памяти данных. Поэтому имейте в виду, что память данных полна ints, strings, globals, locals, всевозможных вещей. Когда мне говорят, где начинается имя файла, я делаю следующее:
Преобразование целого десятичного целочисленного элемента, на который указывает его представление символа ASCII, а затем поиск слева направо, чтобы проверить, завершена ли строка, если а затем просто загружайте каждый символ последовательно в строку «filename». Сделайте это до завершения строки в памяти, а затем сохраните имя файла в таблице. Моя трудность - генерировать имя файла из моей памяти.
Вот пример того, что я пытаюсь сделать:
C++ Синтаксис (Toggle Plain Text)
1.Index Vector NewVector ASCII filename
2.0 240faef0 128123792 'abc7' 'a'
3.0 240faef0 128123792 'abc7' 'ab'
4.0 240faef0 128123792 'abc7' 'abc'
5.0 240faef0 128123792 'abc7' 'abc7'
6.1 1234567a 243225 'k2s0' 'abc7k'
7.1 1234567a 243225 'k2s0' 'abc7k2'
8.1 1234567a 243225 'k2s0' 'abc7k2s'
9. //EXIT LOOP//
10.1 1234567a 243225 'k2s0' 'abc7k2s'
Вот код, который я написал до сих пор, чтобы получить имя файла (Я просто применяя это к элементу 1000 моего DataMemory вектора для тестирования функциональности 1000 произволен).. C++ Синтаксис (Toggle Plain Text)
1.int i = 0;
2.int step = 1000;//top->a0;
3.string filename;
4.char *temp = reinterpret_cast<char*>(DataMemory[1000]);//convert to char
5.cout << "a0:" << top->a0 << endl;//pointer supplied
6.cout << "Data:" << DataMemory[top->a0] << endl;//my vector at pointed to location
7.cout << "Data(1000):" << DataMemory[1000] << endl;//the element I'm testing
8.cout << "Characters:" << &temp << endl;//my temporary char array
9.
10.while(&temp[i]!=0)
11.{
12. filename+=temp[i];//add most recent non-terminated character to string
13. i++;
14. if(i==4)//when 4 characters have been added..
15. {
16. i=0;
17. step+=1;//restart loop at the next element in DataMemory
18. temp = reinterpret_cast<char*>(DataMemory[step]);
19. }
20. }
21. cout << "Filename:" << filename << endl;
Так что вопрос в том, что когда я делаю преобразование моего десятичного элемента в массив символов, я предполагаю, что 8 hex # дадут мне 4 символа. Почему это не так? Вот мой результат:
C++ Синтаксис (Toggle Plain Text)
1.a0:0
2.Data:0
3.Data(1000):4428576
4.Characters:0x7fff5fbff128
5.Segmentation fault
Хорошо, так что я sortof есть это выяснили , Я прошел длинный путь и просто вернулся к своей шестигранной матрице, взял каждое слово, разделил его на 2-битные шестнадцатеричные слова, а затем сделал преобразование в ascii на каждый 2-битный сегмент, затем я приложил результат к моей строке имени файла, итерацию до тех пор, пока я не получу «0» и разбить.Работает хорошо, хотя и громоздким способом. ** conversion = hexCharValue (tempInstructionMemory [1000] [i * 2]) << (4 * 1); conversion + = hexCharValue (tempInstructionMemory [1000] [(i * 2) +1]) << (4 * 0); if (conversion == 0) break; имя файла + = (char) преобразование; ** –