How to convert Byte Array to hex string in visual c++?

前端 未结 5 1180
野性不改
野性不改 2021-01-11 16:59

Declaration of a method are following:

//some.h
void TDES_Decryption(BYTE *Data, BYTE *Key, BYTE *InitalVector, int Length);

I am calling t

相关标签:
5条回答
  • 2021-01-11 17:40

    how about using the boost library like this (snippet taken from http://theboostcpplibraries.com/boost.algorithm ):

    #include <boost/algorithm/hex.hpp>
    #include <vector>
    #include <string>
    #include <iterator>
    #include <iostream>
    
    using namespace boost::algorithm;
    
    int main()
    {
      std::vector<char> v{'C', '+', '+'};
      hex(v, std::ostream_iterator<char>{std::cout, ""});
      std::cout << '\n';
    
      std::string s = "C++";
      std::cout << hex(s) << '\n';
    
      std::vector<char> w{'4', '3', '2', 'b', '2', 'b'};
      unhex(w, std::ostream_iterator<char>{std::cout, ""});
      std::cout << '\n';
    
      std::string t = "432b2b";
      std::cout << unhex(t) << '\n';
    }
    
    0 讨论(0)
  • 2021-01-11 17:47

    This code will convert byte array of fixed size 100 into hex string:

    BYTE array[100];
    char hexstr[201];
    int i;
    for (i=0; i<ARRAY_SIZE(array); i++) {
        sprintf(hexstr+i*2, "%02x", array[i]);
    }
    hexstr[i*2] = 0;
    
    0 讨论(0)
  • 2021-01-11 17:48

    Using stringstream, sprintf and other functions in the loop is simply not C++. It's horrible for performance and these kind of functions usually get called a lot (unless you're just writing some things into the log).

    Here's one way of doing it. Writing directly into the std::string's buffer is discouraged because specific std::string implementation might behave differently and this will not work then but we're avoiding one copy of the whole buffer this way:

    #include <iostream>
    #include <string>
    #include <vector>
    
    std::string bytes_to_hex_string(const std::vector<uint8_t> &input)
    {
      static const char characters[] = "0123456789ABCDEF";
    
      // Zeroes out the buffer unnecessarily, can't be avoided for std::string.
      std::string ret(input.size() * 2, 0);
    
      // Hack... Against the rules but avoids copying the whole buffer.
      char *buf = const_cast<char *>(ret.data());
    
      for (const auto &oneInputByte : input)
      {
        *buf++ = characters[oneInputByte >> 4];
        *buf++ = characters[oneInputByte & 0x0F];
      }
      return ret;
    }
    
    int main()
    {
      std::vector<uint8_t> bytes = { 34, 123, 252, 0, 11, 52 };
      std::cout << "Bytes to hex string: " << bytes_to_hex_string(bytes) << std::endl;
    }
    
    0 讨论(0)
  • 2021-01-11 17:54

    As you have mentioned c++, here is an answer. Iomanip is used to store ints in hex form into stringstream.

    #include <sstream>
    #include <iomanip>
    
    std::string hexStr(BYTE *data, int len)
    {
         std::stringstream ss;
         ss << std::hex;
    
         for( int i(0) ; i < len; ++i )
             ss << std::setw(2) << std::setfill('0') << (int)data[i];
    
         return ss.str();
    }
    
    0 讨论(0)
  • 2021-01-11 17:56

    Here is a somewhat more flexible version (Use uppercase characters? Insert spaces between bytes?) that can be used with plain arrays and various standard containers:

    #include <string>
    #include <sstream>
    #include <iomanip>
    
    template<typename TInputIter>
    std::string make_hex_string(TInputIter first, TInputIter last, bool use_uppercase = true, bool insert_spaces = false)
    {
        std::ostringstream ss;
        ss << std::hex << std::setfill('0');
        if (use_uppercase)
            ss << std::uppercase;
        while (first != last)
        {
            ss << std::setw(2) << static_cast<int>(*first++);
            if (insert_spaces && first != last)
                ss << " ";
        }
        return ss.str();
    }
    

    Example usage (plain array):

    uint8_t byte_array[] = { 0xDE, 0xAD, 0xC0, 0xDE, 0x00, 0xFF };
    auto from_array = make_hex_string(std::begin(byte_array), std::end(byte_array), true, true);
    assert(from_array == "DE AD C0 DE 00 FF");
    

    Example usage (std::vector):

    // fill with values from the array above
    std::vector<uint8_t> byte_vector(std::begin(byte_array), std::end(byte_array));
    auto from_vector = make_hex_string(byte_vector.begin(), byte_vector.end(), false);
    assert(from_vector == "deadc0de00ff");
    
    0 讨论(0)
提交回复
热议问题