2013-03-21 4 views
0

Я пытаюсь преобразовать «двойное» значение (скажем, 1.12345) в 8-байтовую шестую строку. Я использую следующую функцию для преобразования значения double в шестую строку.Байт-массив с шестнадцатеричными цифрами (0-9 и только от A до F)

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

Эта функция возвращает шестнадцатеричную шестнадцатеричную строку. Я затем сжать эту строку, чтобы вписаться в 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 байт «образец» массив. Для каждого байта должна быть только одна шестнадцатеричная цифра. Мне нужно добавить эту восьмибайтную шестую строку в глобальную строку.

Если есть другое решение, которое может преобразовать двойное значение в 8 шестнадцатеричных цифр и наоборот, это было бы высоко оценено.

С уважением.

+1

Как вы ожидаете получить «одну шестую цифру на каждый байт»? Шестнадцатеричная цифра может кодировать только 16 значений, в то время как байт содержит 256. Если вам нужно сделать его меньше, но все еще с читаемыми символами, загляните в [base64] (http://en.wikipedia.org/wiki/Base64). –

+0

Что вы * пытаетесь сделать? Нужна ли ваша «глобальная» строка для чтения или иметь определенный формат? Если нет, вы можете просто скопировать 8 байтов 'double' непосредственно в строку. –

+0

@DrewDormann Да, глобальная строка имеет определенный формат. Я должен сохранить двойное значение в 8 байт, и каждый из этих 8 байтов должен представлять шестую цифру. Позже эти 8 байтов должны быть преобразованы обратно в двойное значение. –

ответ

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(); 
} 
+0

Очевидно, что 'std :: setw' не является липким, вам нужно установить его снова для каждого байта. –

+0

Исправлено. Кажется, сейчас он работает. –

+0

Да, идея состояла в том, чтобы преобразовать double в float. Благодаря DrewDormann –