Форум: "Начинающим";
Текущий архив: 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.063 c