0

「倍精度」値 (1.12345 など) を 8 バイトの 16 進文字列に変換しようとしています。次の関数を使用して、double 値を 16 進文字列に変換しています。

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 バイトの 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 バイトを表す 16 進数を取得するにはどうすればよいですか。1 バイトにつき 1 桁の 16 進数のみが必要です。この 8 バイトの 16 進文字列をグローバル文字列に追加する必要があります。

double値を8桁の16進数に、またはその逆に変換できる他のソリューションがあれば、それは高く評価されます。

よろしく。

4

1 に答える 1

1

16 進数は1/2 バイトを表すため、16 進数が 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();
}
于 2013-03-21T16:45:54.197 に答える