Как преобразовать строку, содержащую шестнадцатеричное целое число - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть строка, например, содержащая 1000, мне нужно сохранить ее в переменной с именем x (например), так что все дело в том, что мне нужно сохранить строку в виде шестнадцатеричного базового целого числа, чтобы, если я добавлю 3 (дляпример)

1000+3=1003
1003+3=1006
1006+3=1009
1009+3=100C
100C+3=100F
100F+3=1012

Ответы [ 5 ]

2 голосов
/ 03 января 2011

Из того, что я могу сказать, у вас есть число в шестнадцатеричном представлении в строке, и вы хотите поместить его в int. Затем вы захотите добавить к этому int и вывести его новое значение снова в шестнадцатеричном представлении для проверки результата.

#include <sstream>
#include <ios>

int main() {
   std::string input = "1000";

   // Read the input string into a stream (streams have format conversion functionality)
   std::stringstream ss;
   ss << std::hex << input;

   // Read the numerical value back out into an int
   int x = 0;
   ss >> x;

   // Add 3 and display result in hex
   x += 3;
   std::cout << std::showbase << std::hex << x; // will output: 0x1003

   // Add another 10 and display result in hex
   x += 10;
   std::cout << std::showbase << std::hex << x; // will output: 0x100d
}

Надеюсь, это поможет.

1 голос
/ 30 декабря 2010

Похоже, вы получаете шестнадцатеричную строку, и вам необходимо сохранить числовое значение в переменной.Затем, в какой-то момент в будущем вам нужно преобразовать обратно из переменной в строку.

Вам не нужно беспокоиться о внутреннем представлении, используемом базовыми числовыми типами (int, long, float),В то время как компьютер изначально сохраняет значение в двоичном виде, языки программирования спроектированы таким образом, что этот факт (несколько) скрыт от вас, поэтому вам не нужно об этом беспокоиться.

Теперь, когда мы позволилиязык абстрагирует внутреннее хранилище как «число», все, что нам нужно, это способ прочитать и записать это число.Все языки имеют функции, которые позволяют вам читать / записывать данные в разных форматах, и вы всегда можете свернуть свои собственные (хотя это не рекомендуется, если вы только не учитесь), поэтому я использую предложения C.

Cscanf() и printf() - есть и другие функции, которые тоже будут выполнять эту работу, но это хороший пример того, что вы можете использовать.Эти функции очень похожи, поэтому легко написать код:

#include <errno.h>

#define FORMAT "%X"

// Converts string input into n integer
//
// args
//   str the string to convert
//   x   pointer to location for return value
//
// returns
//   0 on success
//   nonzero on failure
int get_num_from_hex_string(char* str, int* x)
{
  if( str == 0 ) return EINVAL;
  // we assume MAX_LEN is defined, somewhere...
  if( strlen(str) > MAX_LEN ) return EINVAL;

  int result = scanf(FORMAT, x);
  // there's prolly a better error, but good enough for now
  if( result != 1 ) return EIO; 

  return 0;
}

// Converts an integer into a hex string
//
// args
//   x    - the integer to convert
//   str  - the pre-allocated output buffer
//   len  - amount of space left in str.  Must be
//          at least 12 bytes.
//
// returns
//   0 on success
//   nonzero on failure
int get_hex_string(int x, char*str, int len)
{
  if( str == 0 ) return EINVAL;
  if( len < 12 ) return EINVAL;

  sprintf(str, FORMAT, x);
}


0 голосов
/ 30 декабря 2010

извините за ошибки заранее, я сделал это быстро, не уверен, что это решение, это просто идея

#include <iostream>
#include <string>

using namespace std;

class hexa
{
public:
    hexa(const char* x);
    hexa(int x=0);

    hexa& operator+(int x);
    operator int& ();
    operator string () const;
private:
    int value_;
    friend istream& operator >>(istream &is, hexa& x);
    friend ostream& operator <<(ostream &os, const hexa& x);
};


int main()
{
    hexa x(0x1009);
    cout << "x = " << x << endl;

    hexa y("6");
    cout << "y = " << y << endl;

    cout << "x + y = " << x+y << endl;
    return 0;
}

hexa::hexa(const char* x)
    : value_(stoi(string(x), 0, 16))
{}

hexa::hexa(int x)
    : value_(x)
{}

hexa& hexa::operator+(int x)
{
    value_ += x;
    return *this;
}

hexa::operator int& ()
{
    return value_;
}

hexa::operator string () const
{
    return to_string(_Longlong(value_));
}

istream& operator >>(istream& is, hexa& x)
{
    is >> hex >> x.value_;
    return is;
}
ostream& operator <<(ostream& os, const hexa& x)
{
    os << hex << x.value_;
    return os;
}
0 голосов
/ 30 декабря 2010

Предположим, вы храните вашу строку в переменной:

std::string mystring;

Затем, чтобы выполнить вычисления на нем, вы можете использовать функцию, которую вы определяете сами:

void AddSomeNumber(std::string& mystring, int n)
{
    // Convert the string to integer
    unsigned mynumber;
    sscanf(mystring.c_str(), "%x", &mynumber);

    // Add a number
    mynumber += n;

    // Convert the number to string
    char temp[9]; // pardon my style :-)
    sprintf(temp, "%x", mynumber);
    mystring = temp;
}

int main()
{
    std::string mystring("1009");
    AddSomeNumber(mystring, 3);
    std::cout << mystring << '\n'; // will print 100c
}
0 голосов
/ 30 декабря 2010

Только обычное целое число, и когда вам нужно отобразить его, преобразуйте в шестнадцатеричный формат.

...