(С++)Разбить double на байты
Необходимо в Си ++ разбить переменную типа double на байты, для их следующей передачи по com порту!!!!Чтобы можно было работать с каждым байтом отдельно!!!Программы должна работать под DOS!
Ну вообщето есть такая штука "union" (кажется так пишется).
А если хочеш чтоб красиво то :
double l;
сhar *pc= (char*) &l, i;
for ( i = 0; i < sizeof( double ); ++i )
*pc++; // Вот и байт то
Ну вообщето есть такая штука "union" (кажется так пишется).
А если хочеш чтоб красиво то :
double l;
сhar *pc= (char*) &l, i;
for ( i = 0; i < sizeof( double ); ++i )
*pc++; // Вот и байт то
И это ты считаешь красиво?
И это ты считаешь красиво?
Да. По моему ето красиво, потому что независимо от язика. Кроме того не придется писать каждий раз "->" или "." когда к double обращаемся. Может сам код и лучше написать можно било (ето не я писал), но мне нравится. И вообще ето дело вкуса.
Вот если б надо било к етим байтам произвольно обращатся (скажем сначала к третьему, потом к первому), то тут конечно без union не обойтись.
Да. По моему ето красиво, потому что независимо от язика.
Ну это не С++ :D
Кроме того не придется писать каждий раз "->" или "." когда к double обращаемся.
Ага, лучше завести ещё одну переменную (указатель). :D
Может сам код и лучше написать можно било (ето не я писал), но мне нравится. И вообще ето дело вкуса.
Это дело стиля. Я бы руки за такой оборвал. :)
Вот если б надо било к етим байтам произвольно обращатся (скажем сначала к третьему, потом к первому), то тут конечно без union не обойтись.
А вот это кстати необязательно:
pc[2], pc[0]
Ага, лучше завести ещё одну переменную (указатель). :D
А вот это кстати необязательно:
pc[2], pc[0]
Убедил! Хуже, но всеравно красиво.
А может и бистрее. Хотя зачем бистрее если ето для com порта.
И если человеку разние типи в етот порт совать придется - что все как union обявлять ? А так под любой катит (разве чтотото большое и структурное что в разних местах в памяти лежит) и одной переменной (указателя) хватит на все.
А вот действительно, Green, как бы ты написал?
А я сомневаюсь, что у меня вообще такая необходимость возникла бы. ;)
Но если бы возникла (форс-мажор), то я бы использовал union или забабахал что-то типа такого:
inline char getByte(const T& obj, int byteNum)
{
return byteNum < sizeof(T) ?
reinterpret_cast<char*>(&T)[sizeof(T)-1-byteNum] :
0;
}
Ну это я скорее шучу... ;)
inline char Get(double *d, int n)
{
return n<sizeof(double)?((char *)d)[n]:0;
}
Здесь еще один проблем отрисовался, т.к. низкоуровневая передача то неплохо бы не перепутать MSB и LSB, а то промашка выйти может
А скажите пожалуйста что ето "MSB" "LSB". (Только не смейтесь над вопросом пожалуйста)
А скажите пожалуйста что ето "MSB" "LSB". (Только не смейтесь над вопросом пожалуйста)
Смеюсь! Но не над вопросом - потому что ответа сам не знал. Для того, что бы узнать что это такое мне потребовалось секунд 10. Как? Вводим в гугле строчку MSB LSB и через пару секунд созерцаем результаты.
А скажите пожалуйста что ето "MSB" "LSB". (Только не смейтесь над вопросом пожалуйста)
Most Significant Byte and Less Significant Byte
старший и соответственно младший значащие байты.
Например, запишите число 0xFAAF в двоичный файл, затем откройте его каким-нибудь двоичным редактором (вроде F3 в TC) и посмотрите порядок следования байт. Так вот, к чему это все, если вы считаете из файла в буфер DWORD - все OK, а если по байтам - скорее всего получите не то, что ожидали