Преобразовать десятичную в ASCII
У меня возникли трудности с использованием reinterpret_cast. Сразу скажем, что я не женат или reinterpret_cast. Не стесняйтесь предлагать серьезные изменения. Прежде чем я покажу вам свой код, я дам вам знать, что я пытаюсь сделать.
Я пытаюсь получить имя файла из вектора, полного данных, используемых процессором MIPS I, который я разработал. По сути, я делаю компиляцию двоичного файла из тестовой программы для моего процессора, выгружаю все шестнадцатеричные числа из двоичного файла в вектор в моей программе на C++, преобразую все эти шестнадцатеричные числа в десятичные целые и сохраняю их в векторе DataMemory, который является данными. блок памяти для моего процессора. У меня также есть память инструкций. Поэтому, когда мой процессор выполняет инструкцию SYSCALL, такую как "Открыть файл", мой эмулятор операционной системы C++ получает указатель на начало имени файла в моей памяти данных. Так что имейте в виду, что память данных полна целочисленных, строковых, глобальных, локальных и всяких других вещей. Когда мне говорят, где начинается имя файла, я делаю следующее:
Преобразуйте весь десятичный целочисленный элемент, на который указывает его символьное представление ASCII, а затем выполните поиск слева направо, чтобы увидеть, заканчивается ли строка, если нет, то просто последовательно загрузите каждый символ в строку "filename". Делайте это до завершения строки в памяти, а затем сохраните имя файла в таблице. Моя проблема заключается в создании имени файла из моей памяти.
Вот пример того, что я пытаюсь сделать:
Синтаксис C++ (Переключить обычный текст)
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++ (Переключить обычный текст)
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 шестнадцатеричных # дадут мне 4 символа. Почему это не так? Вот мой вывод:
Синтаксис C++ (Переключить обычный текст)
1.a0:0
2.Data:0
3.Data(1000):4428576
4.Characters:0x7fff5fbff128
5.Segmentation fault
2 ответа
Если ваши строки заканчиваются нулем, вы не хотите делать
10. while(temp[i]!=0)
вместо
10. while(&temp[i]!=0)
Не уверен, что я понимаю структуру DataMemory, хотя...
Извините, но код беспорядок. Если вы хотите распечатать необработанные данные, то вам нужно понять, что nul-char фактически равен нулю, что является очень распространенным значением в необработанных данных.
Поэтому печать необработанной строки, скорее всего, закончится преждевременно, потому что будет найден nul-char.
Как уже упоминалось, тест, вероятно, должен быть while(temp[i] != 0)
и не while(&temp[i] != 0)
который никогда не будет ложным, потому что адрес любой ячейки памяти (вне ядра) равен!= 0.