реклама на сайте
подробности

 
 
> формат хранения данных в KEIL C51, нафига данные задом наперед :)
nik_al
сообщение Oct 2 2006, 18:23
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 23-07-04
Пользователь №: 358



Как вещь мне в кейле не нравится(может быть единственная) этот самый формат. Приходит ко мне пакет где данные лежат INTEL формате т.е. 1й байт младший и читаю я из этого пакета в переменную типа ulong вот таки некрасивым способом:

ULONG(ltemp).b[3]=rxbuf[0];
ULONG(ltemp).b[2]=rxbuf[1];
ULONG(ltemp).b[1]=rxbuf[2];
ULONG(ltemp).b[0]=rxbuf[3];

макрос:
//-----------------------------------------------------
// Type for treating 4 byte variables with byte by byte
//-----------------------------------------------------
typedef union _un_long {
unsigned long dw;
unsigned char b[4];
}un_long;

#define ULONG(x) (*((un_long*)&x))
У кого есть другие способы решения этой проблемы поделитесь пожлста
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
bialix
сообщение Oct 5 2006, 12:50
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046



Под GCC есть макросы для переворота байтов, определtны в заголовке byteswap.h


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post
savikon
сообщение Nov 28 2006, 17:58
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 14-11-05
Из: Санкт-Петербург
Пользователь №: 10 812



я поступал еще некрасивее:
unsigned long lOutWord _at_ 0x20;
unsigned char cOutWord0 _at_ 0x23;
unsigned char cOutWord1 _at_ 0x22;
unsigned char cOutWord2 _at_ 0x21;
unsigned char cOutWord3 _at_ 0x20;
и получал от кейла четыре ругательства<img>
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Nov 28 2006, 21:36
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



Сдвиги на 0,8,16,24 компилятор должен прооптимизировать в присваивания.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 28 2006, 22:27
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(nik_al @ Oct 2 2006, 17:23) *
Приходит ко мне пакет где данные лежат INTEL формате т.е. 1й байт младший

Ну это неправильно - в нормальных протоколах данные в машинозависимых форматах ходить не должны :-).
Ну а для разворота - классика жанра htons() "Host to Network Short" и htonl() "Host to Network Long" может существовать в поставке, как минимум реализован в виде макросов:
Код
#define htons(p)  ( *(p) = (*(p) << 8) | (*(p) >> 8))
#define htonl(p)  ( htons (&((unsigned short*)(p))[0]), \
                     htons (&((unsigned short*)(p))[1]), \
                     *(p) = (*(p) << 16) | (*(p) >> 16) )


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
evg123
сообщение Dec 7 2006, 21:42
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 353
Регистрация: 11-09-06
Из: Минск
Пользователь №: 20 282



В этом есть какой-то скрытый смысл. Я натыкался на объяснение, счел его разумным, и потом сразу забыл smile.gif ! Но пользуюсь вегда стадартными сдвигами и встроенными функциями типа _irol()_, _iror()_ и никогда не имел проблем. Вообще, в машинно-зависимые свойства компиляторов лучше не лезть.

Цитата(Andy Great @ Nov 28 2006, 21:36) *
Сдвиги на 0,8,16,24 компилятор должен прооптимизировать в присваивания.

Кстати да! Он великолепно оптимизирует!
Go to the top of the page
 
+Quote Post
savikon
сообщение Dec 21 2006, 13:00
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 14-11-05
Из: Санкт-Петербург
Пользователь №: 10 812



Цитата(Andy Great @ Nov 28 2006, 21:36) *
Сдвиги на 0,8,16,24 компилятор должен прооптимизировать в присваивания.

а на 7 оптимизирует в 7 сдвигов всех 32-х разрядов<img> и приходится вручную переставлять байты и сдвигать только один раз
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016