Как преобразовать BYTE в FLOAT?
От: Kven Украина  
Дата: 19.03.03 10:48
Оценка:
Привет!

Суть проблемы:
Есть некий файл, он заливается в битовый буффер, в файле хранятся данные разных типов
DWORD int CHAR и float. Нужно данные float вытащить из битового буффера отредактировать и
запихнуть обратно.
Re: Как преобразовать BYTE в FLOAT?
От: Павел Кузнецов  
Дата: 19.03.03 11:09
Оценка: -1
Здравствуйте, Kven, Вы писали:

K> данные float вытащить из битового буффера отредактировать и запихнуть обратно.


Например:

byte b [sizeof(float)] = ...;

// получить текущие данные:
float old_value = *reinterpret_cast<const float*>(b);

// записать новые:
float new_value = old_value + 1.0f;
*reinterpret_cast<float*>(b) = new_value;
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Как преобразовать BYTE в FLOAT?
От: Vamp Россия  
Дата: 19.03.03 11:14
Оценка:
Здравствуйте, Kven, Вы писали:

K>Есть некий файл, он заливается в битовый буффер, в файле хранятся данные разных типов

K>DWORD int CHAR и float. Нужно данные float вытащить из битового буффера отредактировать и
K>запихнуть обратно.

Очень просто.


byte b[BUFFER_SIZE];

//b is initialized 
//....

float *pfNum;
pfNum=(float *)(b+nOffset); //nOffset - offset in byte array of our number
*pfNum=*pfNum+2003;
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Как преобразовать BYTE в FLOAT?
От: Vamp Россия  
Дата: 19.03.03 11:16
Оценка: -1
ПК>
ПК>byte b [sizeof(float)] = ...;

ПК>// получить текущие данные:
ПК>float old_value = *reinterpret_cast<const float*>(b);

ПК>// записать новые:
ПК>float new_value = old_value + 1.0f;
ПК>*reinterpret_cast<float*>(b) = new_value;
ПК>


Насколько я понял условия задачи, так вообще ничего не выйдет. А из общих соображений — только reinterpret_cast и не хватает для полного счастья.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Как преобразовать BYTE в FLOAT?
От: Артур Россия  
Дата: 19.03.03 11:35
Оценка: 19 (2)
Здравствуйте, Vamp, Вы писали:

V>Здравствуйте, Kven, Вы писали:


K>>Есть некий файл, он заливается в битовый буффер, в файле хранятся данные разных типов

K>>DWORD int CHAR и float. Нужно данные float вытащить из битового буффера отредактировать и
K>>запихнуть обратно.

V>Очень просто.


V>

V>
V>byte b[BUFFER_SIZE];

V>//b is initialized 
V>//....

V>float *pfNum;
V>pfNum=(float *)(b+nOffset); //nOffset - offset in byte array of our number
V>*pfNum=*pfNum+2003;
V>


V>


Так будут проблемы с выравниванием. То есть, если в буфере хранится byte а потом float (nOffset нечётный), то мы получим указатель на float по нечётному адресу.
Так что извлекать нужно так:

float a;
memcpy(&a,b+nOffset,sizeof(float));

обратно записывать — аналогично.
... << RSDN@Home 1.0 beta 6a >>
Re[3]: Как преобразовать BYTE в FLOAT?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 19.03.03 11:40
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Насколько я понял условия задачи, так вообще ничего не выйдет. А из общих соображений — только reinterpret_cast и не хватает для полного счастья.


А как ты понял условие задачи?
Спрашиваю, так как пользовался таким способом не один раз и все было замечательно.
Кроме того, может хоть каплю конструктива добавишь? Или хотя бы аргументов в пользу своей точки зрения.
... << RSDN@Home 1.0 beta 5 >>
Re[3]: Как преобразовать BYTE в FLOAT?
От: Павел Кузнецов  
Дата: 19.03.03 11:41
Оценка:
Здравствуйте, Vamp, Вы писали:

ПК>>
ПК>> float old_value = *reinterpret_cast<const float*>(b);
ПК>> *reinterpret_cast<float*>(b) = new_value;
ПК>>


V> Насколько я понял условия задачи, так вообще ничего не выйдет.


Можно здесь поподробнее?..

V> А из общих соображений — только reinterpret_cast и не хватает для полного счастья.


А какие альтернативы? Functional cast? — А какая разница?
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Как преобразовать BYTE в FLOAT?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 19.03.03 11:50
Оценка:
Здравствуйте, Артур, Вы писали:

А>Так будут проблемы с выравниванием. То есть, если в буфере хранится byte а потом float (nOffset нечётный), то мы получим указатель на float по нечётному адресу.


Ну и пусть он лежит по нечетному адресу, какая разница? Проблем с выравниванием не будет.

А>memcpy(&a,b+nOffset,sizeof(float));


А с memcpy, imho, падает читабельность...
... << RSDN@Home 1.0 beta 5 >>
Re[4]: Как преобразовать BYTE в FLOAT?
От: Павел Кузнецов  
Дата: 19.03.03 12:44
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

А>> Так будут проблемы с выравниванием.


ММ> Ну и пусть он лежит по нечетному адресу, какая разница? Проблем с

ММ> выравниванием не будет.

Строго говоря, Артур прав. Если, например, для некоей платформы значения float
должны находиться по адресам, кратным, скажем, 4, а в буфере одно из значений
находится по адресу, не соответствующему этому требованию, работа с этим адресом
как с указателем на float, может привести к аппаратному исключению.

С другой стороны, я в значительной степени уверен, что автору вопроса в данном
случае никакого дела до выравнивания нет, т.к., скорее всего, он имеет дело с
Windows on Intel
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Как преобразовать BYTE в FLOAT?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 19.03.03 12:52
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Строго говоря, Артур прав. Если, например, для некоей платформы значения float


Только что, за чашкой чая, пришли к этому же
... << RSDN@Home 1.0 beta 5 >>
Re[4]: Как преобразовать BYTE в FLOAT?
От: Vamp Россия  
Дата: 19.03.03 13:43
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, Vamp, Вы писали:


ПК>>>
ПК>>> float old_value = *reinterpret_cast<const float*>(b);
ПК>>> *reinterpret_cast<float*>(b) = new_value;
ПК>>>


V>> Насколько я понял условия задачи, так вообще ничего не выйдет.


ПК>Можно здесь поподробнее?..

Я так понял, что в битовом массиве лежит много-много всего и где-то не в начале, по определенному смещению находится требуемый флоат. Здесь же никакого смещения.


V>> А из общих соображений — только reinterpret_cast и не хватает для полного счастья.


ПК>А какие альтернативы? Functional cast? — А какая разница?

Любое приведение типов — команда компилятору в стиле "я тут хреново написал, но ты не обращай внимания". Отключается проверка типов компилятора. Приведение указателей — еще туда-сюда, реинтерпрет — совсем плохо, потому что отключает всякие проверки. Поэтому лучше всяческих приведений избегать. И последнее — как я понимаю, реинтерпрет — чисто плюсовая штука. А указатели можно в анси-с приводить.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Как преобразовать BYTE в FLOAT?
От: Vamp Россия  
Дата: 19.03.03 13:48
Оценка:
Здравствуйте, Артур, Вы писали:

А>Так будут проблемы с выравниванием. То есть, если в буфере хранится byte а потом float (nOffset нечётный), то мы получим указатель на float по нечётному адресу.


Вопрос. Как я понимаю, в Intel-архитектуре для увеличения скорости доступа ВСЕ значения имеет смысл выравнивать на размер ЕАХ. Но можно этого и не делать, ничего страшного за исключением падения скорости не произойдет, чему доказательством служит директива pack — можно выравнивать и по единице. Или я где-то неправ?
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Как преобразовать BYTE в FLOAT?
От: Patalog Россия  
Дата: 19.03.03 13:52
Оценка:
Здравствуйте, Vamp, Вы писали:

[]

V>Любое приведение типов — команда компилятору в стиле "я тут хреново написал, но ты не обращай внимания". Отключается проверка типов компилятора. Приведение указателей — еще туда-сюда, реинтерпрет — совсем плохо, потому что отключает всякие проверки. Поэтому лучше всяческих приведений избегать. И последнее — как я понимаю, реинтерпрет — чисто плюсовая штука. А указатели можно в анси-с приводить.


Хм, а чем в данном случае reinterpret_cast<float*>(b) отличается от вашего
(float *)(b+nOffset);

за исключением смещения? Оно что, "всякие проверки" не отключает?
Почетный кавалер ордена Совка.
Re[4]: Как преобразовать BYTE в FLOAT?
От: Дмитрий Наумов  
Дата: 19.03.03 13:59
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Здравствуйте, Артур, Вы писали:


А>>Так будут проблемы с выравниванием. То есть, если в буфере хранится byte а потом float (nOffset нечётный), то мы получим указатель на float по нечётному адресу.


V>Вопрос. Как я понимаю, в Intel-архитектуре для увеличения скорости доступа ВСЕ значения имеет смысл выравнивать на размер ЕАХ. Но можно этого и не делать, ничего страшного за исключением падения скорости не произойдет, чему доказательством служит директива pack — можно выравнивать и по единице. Или я где-то неправ?


А кто сказал, что здесь про Intel говорят?
... << RSDN@Home 1.0 beta 5 >>
Re[5]: Как преобразовать BYTE в FLOAT?
От: Павел Кузнецов  
Дата: 19.03.03 14:03
Оценка:
Здравствуйте, Vamp, Вы писали:

V> Приведение указателей — еще туда-сюда, реинтерпрет -

V> совсем плохо, потому что отключает всякие проверки.

То, что ты называешь "приведением указателей", может выполняться
одним из следующих способов: reinterpret_cast, static_cast, const_cast или
их комбинацией. В случае, если написан reinterpret_cast, компилятор слепо
следует инструкциям программиста. В случае "приведения указателей" компилятор
подбирает одну из работающих комбинаций, оставляя не больше проверок, нежели
с reinterpret_cast (на деле даже меньше). В данном случае "приведение указателей"
будет выполняться именно через reinterpret_cast, только в коде будет выглядеть
чуть безобиднее. Таким образом, из всех "опасных" приведений типов то,
что ты назвал "приведением указателей" — самое опасное.

V> реинтерпрет — чисто плюсовая штука. А указатели можно в анси-с приводить.


Это — да, аргумент
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Как преобразовать BYTE в FLOAT?
От: Vamp Россия  
Дата: 19.03.03 14:19
Оценка:
ДН>А кто сказал, что здесь про Intel говорят?

А про что тогда тут говорят? А то как-то неконкретно.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Как преобразовать BYTE в FLOAT?
От: Vamp Россия  
Дата: 19.03.03 14:24
Оценка:
ПК>То, что ты называешь "приведением указателей", может выполняться
ПК>одним из следующих способов: reinterpret_cast, static_cast, const_cast или
ПК>их комбинацией.
Если ты в этом уверен, значит так оно и есть. Хоть на С, хоть на С++ — только cast-семейство. Я все равно, конечно, не понимаю — что значит "может выполняться" с точки зрения компилятора. Я считал, что приведение типов проосто сообщает компилятору, что данное присваивание корректно и вообще ничего не выполняет (случаи с переопределениями приведения типов а-ля CString рассматривать не будем), но значит, я жестоко ошибался.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Как преобразовать BYTE в FLOAT?
От: Дмитрий Наумов  
Дата: 19.03.03 14:35
Оценка:
Здравствуйте, Vamp, Вы писали:


ДН>>А кто сказал, что здесь про Intel говорят?


V>А про что тогда тут говорят? А то как-то неконкретно.


Был задан вопрос:

Суть проблемы:
Есть некий файл, он заливается в битовый буффер, в файле хранятся данные разных типов
DWORD int CHAR и float. Нужно данные float вытащить из битового буффера отредактировать и
запихнуть обратно.


Упоминания про конкретную платформу не было. Поэтому, как сказал Миша Можаев:

Только что, за чашкой чая, пришли к этому же


мы обсуждали ситуацию, про которую сказал Павел Кузнецов:

Строго говоря, Артур прав. Если, например, для некоей платформы значения float
должны находиться по адресам, кратным, скажем, 4, а в буфере одно из значений
находится по адресу, не соответствующему этому требованию, работа с этим адресом
как с указателем на float, может привести к аппаратному исключению.


Конечно можно сказать — "в моем случае все и так работает, и я не хочу делать лишних телодвижений". Только потом наступает момент, когда вы вынуждены перенести свой код (который, как вам кажется, полностью ANSI С compliant) на другую платформу и с удивлением обнаружить большие проблемы с выравниванием, познакомиться с двумя индейцами — Big & Little и со множеством других проблем.
... << RSDN@Home 1.0 beta 5 >>
Re[7]: Как преобразовать BYTE в FLOAT?
От: Vamp Россия  
Дата: 19.03.03 14:54
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>мы обсуждали ситуацию, про которую сказал Павел Кузнецов:
ДН>

ДН>Строго говоря, Артур прав. Если, например, для некоей платформы значения float
ДН>должны находиться по адресам, кратным, скажем, 4, а в буфере одно из значений
ДН>находится по адресу, не соответствующему этому требованию, работа с этим адресом
ДН>как с указателем на float, может привести к аппаратному исключению.


Вопрос только в том, для какой. Существуют ли платформы, на которых флоаты должны распологаться по четным адресам? Потому, что если таких платформ никто назвать не может, то спор беспредметен.

ДН>познакомиться с двумя индейцами — Big & Little и со множеством других проблем.

Те будут не индейцы, а оконечники Свифтовские — тупые и острые. Но это к делу не относится.
Да здравствует мыло душистое и веревка пушистая.
Re[7]: Как преобразовать BYTE в FLOAT?
От: Павел Кузнецов  
Дата: 19.03.03 14:56
Оценка:
Здравствуйте, Vamp, Вы писали:

V> Если ты в этом уверен, значит так оно и есть.


Вовсе не обязательно верить мне на слово ты волен прочитать стандарт самостоятельно (пункты 5.2.3, 5.2.7, 5.2.9, 5.2.10, 5.2.11, 5.4).

V> Хоть на С, хоть на С++ — только cast-семейство.


Естественно, речь шла о C++. В C присутствует только C-style cast. В C++ последний, как уже было сказано, является самой опасной формой преобразований типов.

V> Я все равно, конечно, не понимаю — что значит

V> "может выполняться" с точки зрения компилятора.

"Выполняться" — мой вольный перевод слова "perform", употребляющегося в стандарте C++.
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.