Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как из 4-ех байт сделать int-овое значение

1.9K
25 июля 2004 года
Goblin
55 / / 02.03.2004
У меня есть 4 байта. Как можно из них слепить int-овое число? И float-овое?
2.0K
25 июля 2004 года
HardMix
78 / / 25.06.2003
Цитата:
Originally posted by Goblin
У меня есть 4 байта. Как можно из них слепить int-овое число? И float-овое?


Дык все также. Берешь массив
BYTE bt[4];
И переменую
int val;
А потом:
memcpy(&val, &bt, sizeof(int));
Это один из способов. Намек ясен? :)

3
25 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by HardMix

Дык все также. Берешь массив
BYTE bt[4];
И переменую
int val;
А потом:
memcpy(&val, &bt, sizeof(int));
Это один из способов. Намек ясен? :)



Неа... Не пройдет.
bt имеет тип BYTE[4], а &bt имеет тип BYTE[4]*, что в данном случае равносильно BYTE**.
Кстати, в твоем примере потенциальный Buffer Overflow. Найдешь?


Все значительно проще:
val = *(int*)bt;

Только обрати внимание, что старшие байты int хранятся в конце массива BYTE[4], т.е. содержимого массива {0x01, 0x02, 0x03, 0x04} будет соотвестствовать значение int 0x04030201.

1.9K
26 июля 2004 года
Goblin
55 / / 02.03.2004
Большое сасыбо, оба способа работают, но почему же 2-ой лучше?
3
26 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Goblin
Большое сасыбо, оба способа работают, но почему же 2-ой лучше?



Да потому, что он проще, работает быстрее, не соджержит потенциальных ошибок, да и просто понятнее.

2.0K
26 июля 2004 года
HardMix
78 / / 25.06.2003
Цитата:
Originally posted by Green

Только обрати внимание, что старшие байты int хранятся в конце массива BYTE[4], т.е. содержимого массива {0x01, 0x02, 0x03, 0x04} будет соотвестствовать значение int 0x04030201.


Не отрицаю :) И автор темы должен был в это сам разобраться. Собственно вопрос сформулирован так что разницы это не имеет :D

Цитата:
Кстати, в твоем примере потенциальный Buffer Overflow. Найдешь?


Сдаюсь. Не поможешь? ;)

Цитата:
bt имеет тип BYTE[4], а &bt имеет тип BYTE[4]*, что в данном случае равносильно BYTE**.

. Вероятно ты прав. Привык работать с динамическими массивами, забыл как тут со статическими-то :)

3
26 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by HardMix

Сдаюсь. Не поможешь? ;)


Рассмотрим твой, но исправленный пример
memcpy(&val, bt, sizeof(int));
т.е. bt без амперсанда(&)
Так вот sizeof(int) не обязательно равен sizeof(bt), и хорошо если он будет меньше, а если больше? Тогда мы вполне можем получить Access Deny.

Как исправить?
Для начала скажу, что memcpy - это пережиток C. На С++ лучше этой функцией не пользоваться.
А исправить можно так:
memcpy(&val, bt, min(sizeof int, sizeof bt));

P.S. С buffer overflow - это я оговорился, невнимательно посмотрел, sizeof чего ты используешь.

3
26 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Green

memcpy(&val, bt, min(sizeof int, sizeof bt));



Хм...
Я тут подумал про min, и родилась задачка для "домашнего задания".

Т.к. тема топика, видимо, исчерпана предлагаю эту задачку.

Обычно min это подобный макрос:

#define min(a,b) (a)<(b)?(a):(b)

Для чего так много скобок, думаю очевидно? :)
Вопрос в том вычисляется ли значение в данном случае (min(sizeof int, sizeof bt)) в рантайм или на этапе компиляции (что возможно при наличии толкового оптимизатора)?
Если результат вычисляется каждый раз в рантайм, что само по себе не есть хорошо, то как перенести это вычисление на этап компиляции?

2.0K
28 июля 2004 года
HardMix
78 / / 25.06.2003
Цитата:
Originally posted by Green


Хм...
Я тут подумал про min, и родилась задачка для "домашнего задания".

Т.к. тема топика, видимо, исчерпана предлагаю эту задачку.

Обычно min это подобный макрос:

#define min(a,b) (a)<(b)?(a):(b)

Для чего так много скобок, думаю очевидно? :)
Вопрос в том вычисляется ли значение в данном случае (min(sizeof int, sizeof bt)) в рантайм или на этапе компиляции (что возможно при наличии толкового оптимизатора)?
Если результат вычисляется каждый раз в рантайм, что само по себе не есть хорошо, то как перенести это вычисление на этап компиляции?


Гы, а я вот сидел и искал оверфлоу :) Чуть лысину на затылке не расцарапал 8)
Насколько я знаю, компилятор на этапе сборки подставляет вместо того что задефайнено макросом то что дефайн означает (во, млин, выразился! :). Так что в реалтайме оно будет вычисляться каждый раз. это был имхо.
Про sizeof'ы.

Цитата:
Так вот sizeof(int) не обязательно равен sizeof(bt)


Эээ, это-то при том что bt объявлена как
BYTE bt[4];
? Вероятно, это возможно только если инт в данном случае размером не четыре байта. Это устроить достаточно просто. Мое предложение - проверить чтоб количество елементов массива байт равнялось сайзофу инта. Возможно на этаме компиляции (как только лучше?). И вопрос в догонку: что произойдет если инт у нас, например, двухбайтен в твоем примере:

Цитата:
val = *(int*)bt;


Проде старшие для инта биты должны урезаться? Я прав?

3
28 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by HardMix

Гы, а я вот сидел и искал оверфлоу :) Чуть лысину на затылке не расцарапал 8)
Насколько я знаю, компилятор на этапе сборки подставляет вместо того что задефайнено макросом то что дефайн означает (во, млин, выразился! :). Так что в реалтайме оно будет вычисляться каждый раз. это был имхо.


Правильно... что ИМХО :D
sizeof - это константное значение, которое вычисляется на этапе компиляции.
Математические операции с константами так же вычисляются на этапе компиляции, т.е. 4/2 не будет вычислятся каждый раз, а лишь единожды, причем еще при компиляции.
Не вижу особого отличия для min с константными аргументами, поэтому, думаю, что и min вычисляется на этапе компиляции. Проверить это несложно, попробуй.

Цитата:
Originally posted by HardMix

Мое предложение - проверить чтоб количество елементов массива байт равнялось сайзофу инта. Возможно на этаме компиляции (как только лучше?).


Конечно, лучше все операции, которые можно сделать на этапе компиляции, сделать именно на этапе компиляции.
Но вот зачем проверять на равенство?
Достаточно узнать минимальный размер, как уже показал.

Цитата:
Originally posted by HardMix

И вопрос в догонку: что произойдет если инт у нас, например, двухбайтен в твоем примере:

Проде старшие для инта биты должны урезаться? Я прав?


Абсолютно.

2.0K
30 июля 2004 года
HardMix
78 / / 25.06.2003
Цитата:
Originally posted by Green

Правильно... что ИМХО :D
sizeof - это константное значение, которое вычисляется на этапе компиляции.
Математические операции с константами так же вычисляются на этапе компиляции, т.е. 4/2 не будет вычислятся каждый раз, а лишь единожды, причем еще при компиляции.
Не вижу особого отличия для min с константными аргументами, поэтому, думаю, что и min вычисляется на этапе компиляции. Проверить это несложно, попробуй.


Ухты. Я как то на это никогда и внимания не обращал. Вообще для меня это естественно и разумно - следовательно скорей всего так и есть
(железная логика. Работает када влом пробовать.)
Значит сейчас нужен кто-нить кто найдет время это проверить и закроет тему :)

356
01 августа 2004 года
molnij
159 / / 20.06.2000
фигушки вам, а не закрытие темы. разве что как не соответствующей теме форума :), но так как вопрос интересный, а тем негусто - пусть живет

а теперь по делу.
ну во-первых тема топика даже и не начала исчерпывать себя. Так как было замечено, что memcpy - пережиток прошлого (что кстати, неверно - для копирования строк и подобной фигни - самое то), то советую обратить внимание на различные X_cast'ы - static_cast, reinterpret_cast и т.д. - это как раз то, что вам надо... хотя все нормальные люди юзают именно двойное преобразование указателей :) - проще и быстрее, зато менее корректно с точки зрения С++.

Как будет вычисляться min, заранее сказать нельзя. это одна из фишек, которые отдаются на откуп компилятору. хотя, скорее всего, при выключенной оптимизации будет точно считаться в рантайме, а при включенной - никто не знает, кто, как, где и когда вычисляется. если надо перевести на этап компиляции, то можно использовать различные __intXX - у них заранее определен размер.

Кстати, sizeof - это не константа, а оператор!!!! а математические операции вычисляются на этапе компиляции лишь при включенной оптимизации И по желанию компилятора в define'ах. А если попробовать говорить о различных системах... ну да ладно... форум все-таки про winapi :)

удачи :)
2.0K
01 августа 2004 года
HardMix
78 / / 25.06.2003
Цитата:
Originally posted by molnij
фигушки вам, а не закрытие темы. разве что как не соответствующей теме форума :), но так как вопрос интересный, а тем негусто - пусть живет

а теперь по делу.
ну во-первых тема топика даже и не начала исчерпывать себя. Так как было замечено, что memcpy - пережиток прошлого (что кстати, неверно - для копирования строк и подобной фигни - самое то), то советую обратить внимание на различные X_cast'ы - static_cast, reinterpret_cast и т.д. - это как раз то, что вам надо... хотя все нормальные люди юзают именно двойное преобразование указателей :) - проще и быстрее, зато менее корректно с точки зрения С++.

Как будет вычисляться min, заранее сказать нельзя. это одна из фишек, которые отдаются на откуп компилятору. хотя, скорее всего, при выключенной оптимизации будет точно считаться в рантайме, а при включенной - никто не знает, кто, как, где и когда вычисляется. если надо перевести на этап компиляции, то можно использовать различные __intXX - у них заранее определен размер.

Кстати, sizeof - это не константа, а оператор!!!! а математические операции вычисляются на этапе компиляции лишь при включенной оптимизации И по желанию компилятора в define'ах. А если попробовать говорить о различных системах... ну да ладно... форум все-таки про winapi :)

удачи :)


Гы, спасибо что наставил на путь истинный :) Думаю, сия полезная инфа может пригодиться многим.

3
15 августа 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by molnij

Как будет вычисляться min, заранее сказать нельзя. это одна из фишек, которые отдаются на откуп компилятору. хотя, скорее всего, при выключенной оптимизации будет точно считаться в рантайме, а при включенной - никто не знает, кто, как, где и когда вычисляется.


Конкретные факты. Лично я другого мнения, и мнение это не напустом месте.
Заметь, min не просто, а от констактных значений.

Цитата:
Originally posted by molnij

если надо перевести на этап компиляции, то можно использовать различные __intXX - у них заранее определен размер.


Не понял, причем тут это?
Если мне что-то надо перевести на этап компиляции, я использую шаблонные классы.

Цитата:
Originally posted by molnij

Кстати, sizeof - это не константа, а оператор!!!! а математические операции вычисляются на этапе компиляции лишь при включенной оптимизации И по желанию компилятора в define'ах.


ЕРУНДА!!!
sizeof ВСЕГДА вычисляется на этапе компиляции:

Цитата:

sizeof
The sizeof operator is a compile-time operator that returns the size, in bytes, of the argument passed to it.

356
16 августа 2004 года
molnij
159 / / 20.06.2000
Green, спасибо.
и вправду я не прав оказался.
хотя...Green, можешь сказать откуда взято это:
Цитата:
sizeof
The sizeof operator is a compile-time operator that returns the size, in bytes, of the argument passed to it.


и есть ли там что-нибудь подобное для арифметических и тернарного операторов?
у трупа страуса я к сожалению ничего подобного не нашел :(

3
16 августа 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by molnij
Green, спасибо.
и вправду я не прав оказался.
хотя...Green, можешь сказать откуда взято это:

и есть ли там что-нибудь подобное для арифметических и тернарного операторов?
у трупа страуса я к сожалению ничего подобного не нашел :(



http://www.cppreference.com
а точнее здесь:
http://www.cppreference.com/keywords_details.html#sizeof

В стандарте С++, кроме того, сказано:

Цитата:

The result is a constant of an implementation-defined type which is
the same type as that which is named size_t in the standard header
<cstddef>



http://www.csci.csusb.edu/dick/c++std/cd2/expr.html#expr.sizeof

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог