Преобразовать десятичное число в ASCII - PullRequest
1 голос
/ 14 июня 2010

Мне трудно использовать 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 ]

0 голосов
/ 14 июня 2010

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

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

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

0 голосов
/ 14 июня 2010

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

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

вместо

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...