2010-06-14 4 views
1

У меня возникли трудности с использованием 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 
+0

Хорошо, так что я 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) преобразование; ** –

ответ

0

Если строки завершается нулем, вы не хотите, чтобы сделать

10. while(temp[i]!=0)

вместо внесения

10. while(&temp[i]!=0)

Не уверен, что я понимаю структуру DataMemory, хотя ...

+0

Когда я удаляю &, я получаю segfault. Я не эксперт с указателями или чем-то еще, поэтому я уверен, что я делаю что-то неправильно здесь. Если я не буду разыскивать temp, я не проверю местоположение массива, а не содержимое? –

+0

Структура DataMemory немного запутанна. Просто подумайте об этом как о том, что все в программе, которая не является инструкциями, включая стек, кучу и статические данные. Я взял эти разделы двоичного файла и загрузил их в свой вектор DataMemory. Теперь мой процессор имеет доступ ко всем требуемым статическим данным и имеет место для размещения результатов. В устойчивом состоянии у меня просто есть куча констант и имен файлов и адресов в моем векторе данных, который будет использоваться позже программой, которую я буду запускать на моем процессоре. –

+0

Я думаю, что, может быть, я поставил проблему, похоже, больше, чем она есть. Вот что я пытаюсь сделать: HEX (41424344) = DEC (1094861636) = ASCII ('A', 'B', 'C', 'D') У меня есть часть HEX to DEC down отлично, но я не могу понять, как сделать вторую часть. Я попытался использовать reinterpret_cast со многими проблемами. Любые простые решения этой проблемы? –

0

Извините, но код беспорядок. Если вы хотите распечатать необработанные данные, вам нужно понять, что nul-char фактически равен нулю, что является очень распространенным значением в необработанных данных.

Печать исходной строки, скорее всего, закончится преждевременно, потому что будет найден нуль-char.

Как уже упоминалось, тест должен вероятно быть while(temp[i] != 0) и не while(&temp[i] != 0), который никогда не будет ложным, так как адрес любой ячейки памяти (вне ядра) есть! = 0.

+0

Это нормально. Это не моя специальность, поэтому любая помощь ценится. Я буду следовать предыдущему совету, чтобы изменить свой тест. Кроме того, предполагается, что MIPS ISA позаботится о завершении строки в правильном месте. Я предполагаю, что основной раздел, на котором я застрял, - это преобразование десятичного значения, содержащегося в одном элементе, в его представление ASCII и вставка его в какой-то проверяемый массив. Это возможно? –

+0

Строки (строки C - char *) завершаются первым nul-char. Это стандартное определение. Если у вас есть компилятор, который следует стандартам C/C++, он будет интерпретировать строки C таким образом (на самом деле его работа компиляторов, чтобы все платформы выглядели одинаково с точки зрения кода). Ну, ASCII представление данных, это не очень понятно. Если вы хотите сделать сопоставление ASCII для печатаемых данных, вам нужно отфильтровать непечатаемые - см. 'Ctype.h' (в C) /' cctype' (в C++) –

+0

Я немного смущен тем, что вы означает «с первым nul-char». Скажем, моя строка - «abcd» и в моем векторе, не будет ли она представлена ​​«a», «b», «c», «d», «/ 0»? –

Смежные вопросы