2013-09-30 1 views
0

В предыдущих версиях Delphi (мы используем Delphi 2009), запись TFloatRec (используется в floatToDecimal) был определен какDelphi xe5 и TFloatRec и System.floatToDecimal

TFloatRec = packed record 
    Exponent: Smallint; 
    Negative: Boolean; 
    Digits: array[0..20] of AnsiChar; 
end; 

Однако в Delphi xe5 (и я думаю, что это может быть изменен в XE3), она определяется как ..

TFloatRec = packed record 
    Exponent: Smallint; 
    Negative: Boolean; 
    Digits: array[0..20] of Byte; 
    end; 

Мы используем эту запись, чтобы преобразовать расширенное поле в RawByteString, кто может предложить то, что я могу сделать, чтобы преобразовать результаты вызова FloatToDecimal в RawByteString.

Контекст

Этот метод вызывается во время чтения буфера из сети связи, поэтому она должна быть как можно быстрее, без преобразования кодировок и т.д.

+3

Побитно, что «TFloatRec» D2009 и XE3 идентичны. –

+2

Вы уверены, что преобразование из двоичного в десятичное, а затем назад является наиболее эффективным решением? –

+0

Нет, но это устаревший код, который я пытаюсь изменить, после его работы у меня появляется возможность написать для него тесты и рефакторинг. – Mmarquee

ответ

4

Вы можете просто повторно объявить запись D2009 для вашего собственного использования:

type 
    TMyFloatRec = packed record 
    Exponent: Smallint; 
    Negative: Boolean; 
    Digits: array[0..20] of AnsiChar; 
    end; 

Переведите существующий код, чтобы использовать эту запись, и все будет хорошо.

Хотя, вероятно, было бы достаточно легко сделать то, что вы делаете, с новой версией TFloatRec. В конце концов, Byte и AnsiChar имеют одинаковый размер, и вы можете легко отливать их между собой.

+0

Смотря на код слишком долго. Я определил структуру, как это было в Delphi2009, и отбросил ее в DelphiXE5. – Mmarquee