Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2015, 11:24   #1
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию Перестановка байтов

Здравствуйте!

Работаю с пакетами modbus rtu. Данные приходят в "развернутом" виде. Поэтому при получении необходимо менять старший и младший байт в переменных short int. Для этого сделал union _swap_

Код:
union _swap_ {
	short int 			data;
	unsigned char 	bytes[3];
};
Написал функцию swapf, но мне кажется, что можно сделать изящнее. Не проще ли будет использовать битовые поля?

Код:
void swap(short int *a)
{
	union _swap_ swap;

	swap.data=*a;

	swap.bytes[2]=swap.bytes[0];
	swap.bytes[0]=swap.bytes[1];
	swap.bytes[1]=swap.bytes[2];

	*a=swap.data;

}
Bayern_M вне форума Ответить с цитированием
Старый 02.04.2015, 12:31   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Язык другой, но изящнее
Код:
function SwapWord(Value: Word): Word;
begin
  Result:=(Value shl 8) or (Value shr 8);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.04.2015, 12:34   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
void swap(short int *a){return *a<<8||*a>>8;}
Если не ошибаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2015, 12:35   #4
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Язык другой, но изящнее
Код:
function SwapWord(Value: Word): Word;
begin
  Result:=(Value shl 8) or (Value shr 8);
end;
Спасибо, но мне бы в Си намекнуть
Bayern_M вне форума Ответить с цитированием
Старый 02.04.2015, 12:39   #5
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
void swap(short int *a){return *a<<8||*a>>8;}
Если не ошибаюсь.
К сожалению, не работает
Сейчас почитаю, может своими силами додумаюсь где поправить Ваш вариант.
Bayern_M вне форума Ответить с цитированием
Старый 02.04.2015, 14:01   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Во многих компиляторах уже давно есть функции/макросы для изменения индианности.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с чтением байтов Mik92 Общие вопросы Delphi 1 06.01.2015 00:20
перестановка байтов в обратном порядке с++ Niklitel Помощь студентам 1 17.03.2014 09:10
Запись байтов из массива Ultr164 Общие вопросы Delphi 6 05.01.2011 16:26
Сколько байтов ? [iT]aNYBis Помощь студентам 2 04.11.2010 10:31
удаление байтов varelik Общие вопросы Delphi 15 09.12.2009 11:27