类似Python中的 bytes.fromhex(), 从十六进制字符流读取二进制数据
比如,tcpdump下来的data, 我们copy后的hex stream, 如:
b081fd20858480b081fd5f988580b1818c…
// ------------------------------------------------------------------
/*!
Required headers
*/
#include <string>
#include <sstream>
#include <iomanip>
// ------------------------------------------------------------------
/*!
Convert a block of data to a hex string
*/
void toHex( void* const data, //!< Data to convert
const size_t dataLength, //!< Length of the data to convert
std::string& dest //!< Destination string
)
{
unsigned char* byteData = reinterpret_cast<unsigned char*>( data );
std::stringstream hexStringStream;
hexStringStream << std::hex << std::setfill( '0' );
for( size_t index = 0; index < dataLength; ++index )
hexStringStream << std::setw( 2 ) << static_cast<int>( byteData[index] );
dest = hexStringStream.str();
}
/*!
Convert a hex string to a block of data
*/
void fromHex( const std::string& in, //!< Input hex string
void* const data, //!< Data store
size_t& len //!< data length
)
{
size_t length = in.length();
unsigned char* byteData = reinterpret_cast<unsigned char*>( data );
std::stringstream hexStringStream;
hexStringStream >> std::hex;
size_t dataIndex = 0;
for( size_t strIndex = 0; strIndex < length; ++dataIndex )
{
// Read out and convert the string two characters at a time
const char tmpStr[3] = {in[strIndex++], in[strIndex++], 0};
// Reset and fill the string stream
hexStringStream.clear();
hexStringStream.str( tmpStr );
// Do the conversion
int tmpValue = 0;
hexStringStream >> tmpValue;
byteData[dataIndex] = static_cast<unsigned char>( tmpValue );
}
len = dataIndex;
}
https://tweex.net/post/c-anything-tofrom-a-hex-string/