Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.06 c
2-1341842887
Den
2012-07-09 18:08
2013.03.22
remote desktop sreenshot?


1-1295644073
Wadimka
2011-01-22 00:07
2013.03.22
Конвертация даты в миллисекундах в TDateTime


15-1331641742
Kerk
2012-03-13 16:29
2013.03.22
Про профессию


15-1350915204
Дмитрий С
2012-10-22 18:13
2013.03.22
exe с номером билда


15-1334386445
Knight
2012-04-14 10:54
2013.03.22
Белые квадраты под изображениями (иконками) в TListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский