Моя цель — написать более лаконичную / эффективную функцию для преобразования значения в шестнадцатеричную строку, КАК оно хранится в памяти (поэтому напечатанное значение будет зависеть, например, от порядкового номера системы):
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <string>
template<typename T>
std::string hexOf(const T& x)
{
return std::string(reinterpret_cast<const char*>(&x), sizeof(x));
}
int main()
{
std::cout<<hexOf(9283)<<std::endl;
return 0;
}
Текущая реализация не работает, потому что строка содержит символы, но не фактическое шестнадцатеричное представление символов.
Окончательный результат, который я ожидаю hexOf(0xA0B70708)
вернуть строку 0807b7a0
на маленькой системе порядка байтов.
Как сделать это в сжатой / эффективной форме?
Вот стандартный ответ:
template <typename T>
std::string hexify(T const & x)
{
char const alphabet[] = "0123456789ABCDEF";
std::string result(2 * sizeof x, 0);
unsigned char const * const p = reinterpret_cast<unsigned char const *>(&x);
for (std::size_t i = 0; i != sizeof x; ++i)
{
result[2 * i ] = alphabet[p[i] / 16];
result[2 * i + 1] = alphabet[p[i] % 16];
}
return result;
}
Вы можете сделать что-то вроде этого:
template<typename T>
std::string hexOf(const T& x)
{
std::string rc;
rc.reserve(2 * sizeof(x));
for (unsigned char* it(reinterpret_cast<char const*>(&x)), end(it + sizeof(x));
it != end; ++it) {
rc.push_back((*it / 16)["0123456789abcdef"]);
rc.push_back((*it % 16)["0123456789abcdef"]);
}
return rc;
}