Шестнадцатеричное значение байтов в c ++ в строку (эквивалент od -x в Linux)?

Моя цель — написать более лаконичную / эффективную функцию для преобразования значения в шестнадцатеричную строку, КАК оно хранится в памяти (поэтому напечатанное значение будет зависеть, например, от порядкового номера системы):

#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 на маленькой системе порядка байтов.

Как сделать это в сжатой / эффективной форме?

0

Решение

Вот стандартный ответ:

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;
}
2

Другие решения

Вы можете сделать что-то вроде этого:

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;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector