0

我的目标是编写更简洁/有效的函数来将值转换为十六进制字符串,因为它存储在内存中(因此打印的值将取决于系统字节顺序):

#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

如何以简洁/有效的方式做到这一点?

4

2 回答 2

2

这是标准答案:

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;
}
于 2012-10-24T23:31:35.967 回答
0

你可以这样做:

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;
}
于 2012-10-24T23:28:42.483 回答