Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Преобразование массива байтов в вещественное число   Найти похожие ветки 

 
Zheksonz   (2012-06-25 12:27) [0]

Добрый день.
Имеется массив из 8 байтов, в котором хранится вещественное число. Как преобразовать этот массив в вещественное число?


 
Ega23 ©   (2012-06-25 12:29) [1]

System.Move
Только за порядком следить, естественно.


 
MBo ©   (2012-06-25 12:31) [2]

DoubleVar := PDouble(@ByteArr[0])^
(или с помощью absolute)


 
Zheksonz   (2012-06-25 12:31) [3]


> Ega23 ©   (25.06.12 12:29) [1]
> System.MoveТолько за порядком следить, естественно.


Ой чувствую сдвину я сейчас систему ))


 
Inovet ©   (2012-06-25 12:34) [4]

> [3] Zheksonz   (25.06.12 12:31)
> Ой чувствую сдвину я сейчас систему ))

Система устойчиво стоит.


 
Zheksonz   (2012-06-25 12:40) [5]

Если у кого-нибудь есть ссылка на соответствующую документацию, скиньте плз, буду очень благодарен.

Или может проще по аналогии вот с этим СИ_шным кодом сделать?

double __fastcall TWindow::ReadFloat64(TIdTCPClient *TCPClient)
{
TByteDynArray buff;
TCPClient->Socket->ReadBytes(buff, 8, false);
unsigned char *rawbuff = new unsigned char[8];
BytesToRaw(buff, rawbuff, 8);
double float64 = *(double*)rawbuff;
delete rawbuff;
return float64;
}


 
icWasya ©   (2012-06-25 13:19) [6]

Ну если по Си_шному, то почему не так?

double __fastcall TWindow::ReadFloat64(TIdTCPClient *TCPClient)
{
double float64;
TCPClient->Socket->ReadBytes(&float64, 8, false);
return float64;
}


 
Zheksonz   (2012-06-25 13:20) [7]


> icWasya ©   (25.06.12 13:19) [6]


слиииииииииииииишком умный программер ваял, вполне возможно, что обоснованно не так. Хотя не факт конечно.


 
Zheksonz   (2012-06-25 13:36) [8]


> icWasya ©   (25.06.12 13:19) [6]


А по аналогии с этим кодом на Делфи можно сделать соответствующую ф-цию?


 
sniknik ©   (2012-06-25 13:51) [9]

можно. делай.


 
Inovet ©   (2012-06-25 13:51) [10]

> [6] icWasya ©   (25.06.12 13:19)
> то почему не так?

так ещё что-то здесь делается

> [5] Zheksonz   (25.06.12 12:40)
> BytesToRaw(buff, rawbuff, 8);


 
sniknik ©   (2012-06-25 14:07) [11]

> можно. делай.
хотя, честно говоря не понимаю желания запихивать в функцию простой вызов другой функции (+ передача ссылки объекта)... ну мало ли сколько строк это в C занимает/написано кем то, нафига тупо "переводить"?
но... -
function ReadFloat64(TCPClient: TIdTCPClient): Double;
var
 i: Int64 absolute result;
begin
 i:= TCPClient.Socket.ReadInt64(false);
end;


 
Zheksonz   (2012-06-25 18:14) [12]


> sniknik ©   (25.06.12 14:07) [11]


Молодчина! Красиво преобразовал 8 байт.

Спасибо!


 
Zheksonz   (2012-06-25 19:51) [13]


> MBo ©   (25.06.12 12:31) [2]
> DoubleVar := PDouble(@ByteArr[0])^(или с помощью absolute)


МВо, как в воду глядел, молодец. Спасибо.


 
Юрий Зотов ©   (2012-06-25 22:12) [14]

> Zheksonz   (25.06.12 19:51) [13]

Только массив тогда нужно объявлять со словом packed. Так надежнее.


 
Zheksonz   (2012-06-25 23:42) [15]


> Юрий Зотов ©   (25.06.12 22:12) [14]


"Ключевое слово Packed говорит Delphi минимизировать память, взятую определенным объектом.

Обычно, сложные типы данных, такие как записи, имеют свои элементы по 2, 4 или 8 байта, соответствующие типам данных. Например, поле Word было бы 4-байтовое.

Записи также дополняются, для гарантии, что они закончены, 4-х байтовой границей.

Упаковка отменяет это, сжимая данные в наименьшую память, хотя с последующим уменьшенным доступом выполнения."

Т.е. для надёжности, когда 100% известно количество используемых байтов, лучше массивы и записи "паковать"?


 
Zheksonz   (2012-06-25 23:52) [16]

Что в худшем случае может произойти, если объявить массив без слова packed?


 
Inovet ©   (2012-06-26 00:48) [17]

> [15] Zheksonz   (25.06.12 23:42)
> Т.е. для надёжности, когда 100% известно количество используемых
> байтов, лучше массивы и записи "паковать"?

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


 
Юрий Зотов ©   (2012-06-26 00:59) [18]


> Zheksonz   (25.06.12 23:42) [15]
> когда 100% известно количество используемых
> байтов, лучше массивы и записи "паковать"?

Паковать надо тогда, когда требуется, чтобы элементы массива шли в памяти непосредственно друг за другом, без пропусков. Если вы хотите преобразовать 8-байтовый массив в 8-байтовое число так, как сказано в [2], то Вам как раз это и нужно. Иначе массив займет не 8 байт, а больше. Например, при выравнивании на 4-байтовую границу каждый элемент массива будет дополнен неиспользуемыми тремя байтами "мусора" и преобразование по способу [2] даст неверное число.


 
Юрий Зотов ©   (2012-06-26 01:04) [19]


> Zheksonz   (25.06.12 23:52) [16]
> Что в худшем случае может произойти, если объявить массив
> без слова packed?

На сегодня, насколько я знаю, компилятор Delphi пакует массивы даже если слово packed не указано, поэтому не произойдет ничего страшного. Но никто не может дать гарантию, что в какой-нибудь новой версии Delphi это не изменится - и тогда программа, которая раньше работала как часы, вдруг начнет глючить (причем найти причину этот глюка может оказаться непросто). Поэтому лучше сразу подстраховаться и написать packed.


 
Inovet ©   (2012-06-26 03:02) [20]

> [19] Юрий Зотов ©   (26.06.12 01:04)
> что в какой-нибудь новой версии Delphi это не изменится

А идеологически такое допустимо ли?


 
Германн ©   (2012-06-26 03:40) [21]


>  Юрий Зотов ©   (26.06.12 01:04) [19]
>
>
> > Zheksonz   (25.06.12 23:52) [16]
> > Что в худшем случае может произойти, если объявить массив
> > без слова packed?
>
> На сегодня, насколько я знаю, компилятор Delphi пакует массивы
> даже если слово packed не указано, поэтому не произойдет
> ничего страшного. Но никто не может дать гарантию, что в
> какой-нибудь новой версии Delphi это не изменится - и тогда
> программа, которая раньше работала как часы, вдруг начнет
> глючить (причем найти причину этот глюка может оказаться
> непросто). Поэтому лучше сразу подстраховаться и написать
> packed.
>

опять packed array?
Юр, ты хоть бы скажи подробнее - что у тебя вызывает сомнения?


 
Anatoly Podgoretsky ©   (2012-06-26 08:30) [22]


> Но никто не может дать гарантию, что в
> какой-нибудь новой версии Delphi это не изменится - и тогда
> программа, которая раньше работала как часы, вдруг начнет
> глючить

Вот это


 
Zheksonz   (2012-06-26 09:14) [23]

Юрий Зотов ©   (26.06.12 00:59) [18]

Спасибо, учту.


 
Юрий Зотов ©   (2012-06-26 15:05) [24]


> Inovet ©   (26.06.12 03:02) [20]
> А идеологически такое допустимо ли?

Вполне, потому что именно такое поведение соответствует документации - если packed не указано, то массив паковаться не должен. В Паскале так и было и я немало удивился, узнав (из какого-то старого обсуждения здесь же), что в Delphi, оказывается, массив пакуется всегда. Странно, но факт.


 
Zheksonz   (2012-06-26 19:42) [25]

Классно вам ребята, вот так вот смотреть на "бинарный код" и видеть "трёхмерное изображение", со всеми возможными "подводными камнями"...

Это ж какой винт с оперативкой должны быть? Вопрос риторический, но от того не лишённый смысла...

Ещё раз всем спасибо!


 
sniknik ©   (2012-06-26 19:48) [26]

> что в Delphi, оказывается, массив пакуется всегда. Странно, но факт.
может посчитали и решили, что потери на "нечетном" доступе компенсируются упрощением расчета смещения... да и все.


 
Дмитрий Белькевич   (2012-06-26 20:14) [27]


> Классно вам ребята, вот так вот смотреть на "бинарный код"
> и видеть "трёхмерное изображение", со всеми возможными "подводными
> камнями"...


Трехмерное - давно было :)

Однажды наш преподаватель математики пришел утром на лекцию в состоянии полнейшего восторга, чего с ним практически никогда не бывало. Он рассказал, что ему этой ночью приснилось двадцатишестимерное пространство. И это так классно и т. д. и т. п. Он раньше и представить себе даже такое не мог. До этого он мог представить лишь двадцатитрехмерное пространство...


 
Дмитрий Белькевич   (2012-06-26 20:15) [28]

Это не моё, цитата была, да. Нужно было в кавычки завернуть.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.126 c
15-1348475426
AV
2012-09-24 12:30
2013.03.22
Оптимизировать/придумать алгоритм. Просто так.


15-1353184202
Юрий
2012-11-18 00:30
2013.03.22
С днем рождения ! 18 ноября 2012 воскресенье


2-1338103248
moor38
2012-05-27 11:20
2013.03.22
Динамически созданный TImage


15-1330201802
Юрий
2012-02-26 00:30
2013.03.22
С днем рождения ! 26 февраля 2012 воскресенье


2-1336632149
igorium
2012-05-10 10:42
2013.03.22
Чтение названий файлов в написанных НЕрусскими и НЕанглийскими