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

Ваш аккаунт

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

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

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

(С++)Разбить double на байты

11K
12 августа 2005 года
mazz
5 / / 12.08.2005
Необходимо в Си ++ разбить переменную типа double на байты, для их следующей передачи по com порту!!!!Чтобы можно было работать с каждым байтом отдельно!!!Программы должна работать под DOS!
276
12 августа 2005 года
Rebbit
1.1K / / 01.08.2005
Цитата:
Originally posted by mazz
Необходимо в Си ++ разбить переменную типа double на байты, для их следующей передачи по com порту!!!!Чтобы можно было работать с каждым байтом отдельно!!!Программы должна работать под DOS!



Ну вообщето есть такая штука "union" (кажется так пишется).
А если хочеш чтоб красиво то :

double l;
сhar *pc= (char*) &l, i;

for ( i = 0; i < sizeof( double ); ++i )
*pc++; // Вот и байт то

247
12 августа 2005 года
wanja
1.2K / / 03.02.2003
Или можно через union
3
12 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Rebbit
Ну вообщето есть такая штука "union" (кажется так пишется).
А если хочеш чтоб красиво то :

double l;
сhar *pc= (char*) &l, i;

for ( i = 0; i < sizeof( double ); ++i )
*pc++; // Вот и байт то



И это ты считаешь красиво?

276
15 августа 2005 года
Rebbit
1.1K / / 01.08.2005
Цитата:
Originally posted by Green
И это ты считаешь красиво?



Да. По моему ето красиво, потому что независимо от язика. Кроме того не придется писать каждий раз "->" или "." когда к double обращаемся. Может сам код и лучше написать можно било (ето не я писал), но мне нравится. И вообще ето дело вкуса.

Вот если б надо било к етим байтам произвольно обращатся (скажем сначала к третьему, потом к первому), то тут конечно без union не обойтись.

3
15 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Rebbit
Да. По моему ето красиво, потому что независимо от язика.


Ну это не С++ :D

Цитата:
Originally posted by Rebbit

Кроме того не придется писать каждий раз "->" или "." когда к double обращаемся.


Ага, лучше завести ещё одну переменную (указатель). :D

Цитата:
Originally posted by Rebbit

Может сам код и лучше написать можно било (ето не я писал), но мне нравится. И вообще ето дело вкуса.


Это дело стиля. Я бы руки за такой оборвал. :)

Цитата:
Originally posted by Rebbit

Вот если б надо било к етим байтам произвольно обращатся (скажем сначала к третьему, потом к первому), то тут конечно без union не обойтись.


А вот это кстати необязательно:
pc[2], pc[0]

276
15 августа 2005 года
Rebbit
1.1K / / 01.08.2005
Цитата:
Originally posted by Green
Ага, лучше завести ещё одну переменную (указатель). :D
А вот это кстати необязательно:
pc[2], pc[0]



Убедил! Хуже, но всеравно красиво.
А может и бистрее. Хотя зачем бистрее если ето для com порта.
И если человеку разние типи в етот порт совать придется - что все как union обявлять ? А так под любой катит (разве чтотото большое и структурное что в разних местах в памяти лежит) и одной переменной (указателя) хватит на все.

443
15 августа 2005 года
REmindER
292 / / 23.03.2003
А вот действительно, Green, как бы ты написал?
3
15 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by REmindER
А вот действительно, Green, как бы ты написал?


А я сомневаюсь, что у меня вообще такая необходимость возникла бы. ;)
Но если бы возникла (форс-мажор), то я бы использовал union или забабахал что-то типа такого:

 
Код:
template<typename T>
inline char getByte(const T& obj, int byteNum)
{
  return byteNum < sizeof(T) ?
    reinterpret_cast<char*>(&T)[sizeof(T)-1-byteNum] :
    0;
}

Ну это я скорее шучу... ;)
443
16 августа 2005 года
REmindER
292 / / 23.03.2003
Мне бы такое в голову не пришло. :( Я бы написал что-то вроде этого:

inline char Get(double *d, int n)
{
return n<sizeof(double)?((char *)d)[n]:0;
}
443
16 августа 2005 года
REmindER
292 / / 23.03.2003
Вот они - уровни широкого понимания... Гм, не обращайте внимания, благодарю за разъяснения.
585
16 августа 2005 года
honeybeer
297 / / 06.09.2004
Здесь еще один проблем отрисовался, т.к. низкоуровневая передача то неплохо бы не перепутать MSB и LSB, а то промашка выйти может
276
16 августа 2005 года
Rebbit
1.1K / / 01.08.2005
Цитата:
Originally posted by honeybeer
Здесь еще один проблем отрисовался, т.к. низкоуровневая передача то неплохо бы не перепутать MSB и LSB, а то промашка выйти может



А скажите пожалуйста что ето "MSB" "LSB". (Только не смейтесь над вопросом пожалуйста)

243
17 августа 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Rebbit
А скажите пожалуйста что ето "MSB" "LSB". (Только не смейтесь над вопросом пожалуйста)


Смеюсь! Но не над вопросом - потому что ответа сам не знал. Для того, что бы узнать что это такое мне потребовалось секунд 10. Как? Вводим в гугле строчку MSB LSB и через пару секунд созерцаем результаты.

585
17 августа 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by Rebbit
А скажите пожалуйста что ето "MSB" "LSB". (Только не смейтесь над вопросом пожалуйста)


Most Significant Byte and Less Significant Byte
старший и соответственно младший значащие байты.
Например, запишите число 0xFAAF в двоичный файл, затем откройте его каким-нибудь двоичным редактором (вроде F3 в TC) и посмотрите порядок следования байт. Так вот, к чему это все, если вы считаете из файла в буфер DWORD - все OK, а если по байтам - скорее всего получите не то, что ожидали

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