Преобразовать строковый шестнадцатеричный символ в std :: string - PullRequest
2 голосов
/ 08 марта 2012

У меня есть следующее:

char const* code = "3D";

Мне нужно преобразовать этот двухзначный лексический гекс в std :: string, которая будет строкой длиной 1 (не включая нулевой терминатор). У меня также есть библиотека буста. Как я могу это сделать?

В приведенном выше примере у меня должна быть строка std :: string, которая печатает "=", если преобразована правильно.

Ответы [ 4 ]

7 голосов
/ 08 марта 2012

Я думаю, что-то в этом порядке должно работать:

std::istringstream buffer("3D");
int x;

buffer >> std::hex >> x;
std::string result(1, (char)x);

std::cout << result;  // should print "="
4 голосов
/ 08 марта 2012

Например, используя только стандарт C ++ 03:

#include <cstdlib>
#include <string>
#include <iostream>

int main() {
  char const* code = "3D";
  std::string str(1, static_cast<char>(std::strtoul(code, 0, 16)));
  std::cout << str << std::endl;
}

В реальном приложении вам необходимо проверить, была ли преобразована вся строка (второй аргумент strtoul) и находится ли результат преобразования в допустимом диапазоне.


Вот более сложный пример с использованием C ++ 11 и Boost:

#include <string>
#include <cstddef>
#include <iostream>
#include <stdexcept>

#include <boost/numeric/conversion/cast.hpp>

template<typename T>
T parse_int(const std::string& str, int base) {
  std::size_t index = 0;
  unsigned long result = std::stoul(str, &index, base);
  if (index != str.length()) throw std::invalid_argument("Invalid argument");
  return boost::numeric_cast<T>(result);
}

int main() {
  char const* code = "3D";
  std::string str(1, parse_int<char>(code, 16));
  std::cout << str << std::endl;
}
2 голосов
/ 08 марта 2012

Это не C ++, но вы все еще можете использовать старый добрый scanf:

int d;
scanf("%x", &d);

Или из строки, используя sscanf:

int d;
sscanf(code, "%x", &d);

И используя std::string:

int d;
sscanf(code.c_str(), "%x", &d);

В некоторых случаях функции формата C (семейства scanf и printf) проще в использовании, чем объектно-ориентированный эквивалент.

1 голос
/ 08 марта 2012

В Boost версии 1.50 (в мае этого года) вы просто пишете

string s;
boost::algorithm::unhex ( code, std::back_inserter (s));

Работает с std :: string, std :: wstring, QtString, CString и т. Д. И т. Д.

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