字节数组到十六进制数字(仅限0到9和A到F)

时间:2013-03-21 15:30:43

标签: c++ visual-studio-2010 std

我正在尝试转换" double"值(例如1.12345)到8字节的十六进制字符串。我使用以下函数将double值转换为十六进制字符串。

std::string double_to_hex_string(double d)
{
unsigned char *buffer = (unsigned char*)&d;
const int bufferSize = sizeof(double);

char converted[bufferSize * 2 + 1];
//char converted[bufferSize];

int j = 0;
for(int i = 0 ; i < bufferSize ; ++i)
{
    sprintf(&converted[j*2], "%02X", buffer[i]);
    ++j;
}
string hex_string(converted);
return hex_string;
}

此函数返回16字节的十六进制字符串。然后,我通过此代码压缩此字符串以适应8个字节

string hexStr = double_to_hex_string(TempD);

unsigned char sample[8];

for ( int i = 0; i < hexStr.length() / 2 ; i++) 
{
sscanf( (hexStr.substr(i*2,2)).c_str(), "%02X", &sample[i]);
}

现在,我怎样才能得到代表这8个字节的十六进制数字&#34; sample&#34;阵列。每个字节应该只有一个十六进制数字。我需要将这个8字节的十六进制字符串附加到全局字符串。

如果有任何其他解决方案可以将double值转换为8位十六进制数字,反之亦然,那将非常感激。

问候。

1 个答案:

答案 0 :(得分:1)

十六进制数字表示半个字节,因此如果限制为8个十六进制数字,则还限制为存储4个字节。

此解决方案将编码float中的数字,通常为4个字节。

std::string double_to_hex_string(double d)
{
    // Create a stream that writes 2 digit hex values
    std::stringstream stream;
    stream << std::hex << std::setfill('0');

    float f = d;
    const unsigned char *buffer = reinterpret_cast<unsigned char*>( &f );
    const unsigned char *buffer_end = buffer + sizeof(f);

    // Write each byte as 2 character hex.
    while ( buffer != buffer_end )
    {
      stream << std::setw(2) << static_cast<int>( *buffer );
      ++buffer;
    }

    return stream.str();
}