c вводит шестнадцатеричный код без 0x

#c #hex #hexdump

#c #шестнадцатеричный #шестнадцатеричный дамп

Вопрос:

Я создаю проект, который выгружает файл, вводя смещения (шестнадцатеричные). Я должен ввести шестнадцатеричный код с 0x, например 0xBEE4DC, потому что приложение завершит работу или вернет ошибку, если я введу шестнадцатеричный код без 0x, например BEE4DC. Есть ли способ ввести шестнадцатеричный код без «0x»?

Это мой код. я держу этот проект в секрете, поэтому не показываю больше кода, чем это.

dump1.cpp

 void LoadMetadata(char* szFile)
{
    string mystr;
    int offset2;
    int offset1;
    std::cout << "Input unknown offset #1: ";
    getline(cin, mystr);
    stringstream(mystr) >> offset1;
    std::cout << "Input unknown offset #2: ";
    getline(cin, mystr);
    stringstream(mystr) >> offset2;
    std::cout << "n";

    ...

}
  

dump2.cpp

 static int offset2;
static int offset1;

void LoadDumpLib(char* szFile)
{

...
    pCodeRegistration = (DumpCodeRegistration*)MapVATR(offset2, pLibIl2Cpp);
    pMetadataRegistration = (DumpMetadataRegistration*)MapVATR(offset1, pLibIl2Cpp);

...
}
  

Комментарии:

1. Вы можете прочитать свое шестнадцатеричное число (без «0x» в начале) в виде строки, а затем проанализировать строку (проверьте, есть ли в ней «0x» или нет, а затем добавьте «0x» перед следующими операциями, если это необходимо)

Ответ №1:

Этот код должен работать

 std::cout << "Input unknown offset #1: ";
getline(cin, mystr);
stringstream(mystr) >> hex >> offset1;
std::cout << "Input unknown offset #2: ";
getline(cin, mystr);
stringstream(mystr) >> hex >> offset2;
std::cout << "n";
  

Ответ №2:

Следующий код сохраняет число в шестнадцатеричном формате без 0x и загружает его.

 string mystr;
int offset1;
std::cout << "Input unknown offset #1: ";
getline(cin, mystr);
stringstream ss( mystr);
ss << std::hex;
ss >> offset1;
std::cout << offset1 << std::endl;

std::string str2;
stringstream s2;
s2 << std::hex << 0x2123;
s2.flush();
s2 >> str2;
std::cout << str2 << std::endl;
  

Ответ №3:

В коде литеральному значению требуется, чтобы 0x префикс интерпретировался как шестнадцатеричный. Таким образом, 0x не является необязательным в чем-то подобном.

   unsigned x = 0xABC;
  

При чтении значения, например, с использованием потоков, 0x не требуется (фактически, если вам нужен префикс, необходимо закодировать для его обработки). Так, например, используя std::istringstream для чтения данных из std::string ;

   std::string x("ABC");
  std::istringstream sx(x);
  unsigned v;

  sx >>  std::hex >> v;

  if (v == 0xABC) std::cout << "Equaln";