0

私の目標は、値をメモリに格納されているとおりに16進文字列に変換する、より簡潔で効果的な関数を作成することです(したがって、出力される値は、たとえばシステムのエンディアンに依存します)。

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

文字列には文字が含まれているため、現在の実装は機能しませんが、文字の実際の16進表現は機能しません。

私が期待する最終的な結果は、リトルエンディアンシステムで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 に答える