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

 
 
 
Reply to this topicStart new topic
> Разделить "unsigned int" на байты в Си
Visor
сообщение Mar 27 2008, 08:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428



Имеется переменная "unsigned int" и байтовый массив, нужно сравнить эту переменную с двумя байтами из массива (например 0, 1), слово из этих байтов является "unsigned int". Как это красиво сделать?
Посоветуйте хорошую книгу по Си и откуда скачать?
Go to the top of the page
 
+Quote Post
Axxel
сообщение Mar 27 2008, 08:38
Сообщение #2


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

Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896



можно через union, любой учебник, подбельский например
можно через сдвиг и XOR


--------------------
Если боишься - не говори. если сказал - не бойся. ©
Go to the top of the page
 
+Quote Post
yaghtn
сообщение Mar 27 2008, 08:44
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 52
Регистрация: 7-11-05
Из: Чебоксары
Пользователь №: 10 546



Цитата(Visor @ Mar 27 2008, 11:09) *
Имеется переменная "unsigned int" и байтовый массив, нужно сравнить эту переменную с двумя байтами из массива (например 0, 1), слово из этих байтов является "unsigned int". Как это красиво сделать?


В общем случае, Си сам по себе не определяет порядок следования байт.

Как пример:
Код
unsigned_int != ( (unsigned int)(chars[0]) << 8 | chars[1] )


Цитата(Visor @ Mar 27 2008, 11:09) *
Посоветуйте хорошую книгу по Си и откуда скачать?

Гуглить по сигнатуре "Керниган Ричи"
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 27 2008, 08:57
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Насколько я правильно понял, нужно попарно сравнивать байты массива char с числом uint?
Я бы сделал так:

char Mas[N]; // N - число элементов
uint var; // сравниваемая величина
uint *ptr;

...

var=...; // присвоили значение
ptr=&Mas[x]; // поставили указатель на нужный элемент в массиве

if(var==*ptr)... // сравниваем

В этом случае *ptr - это как раз uint значение, состоящее из 2-х байт массива


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 27 2008, 08:58
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Visor @ Mar 27 2008, 11:09) *
Имеется переменная "unsigned int" и байтовый массив, нужно сравнить эту переменную с двумя байтами из массива (например 0, 1),
На подавляющем большинстве современных процессоров "unsigned int" будет занимать 4 байта, что делать с оставшимися 2мя байтами из "unsigned int"? И как нужно сравнивать - на равенство или на больше/меньше?



Цитата
слово из этих байтов является "unsigned int". Как это красиво сделать?
Лучше спроси сколькими способами это можно сделать smile.gif

(Предполагаю, что сравнивать нужно "unsigned short" - оно как раз 2 байта)

Код
unsigned short val2check; // Это сравниваем

unsigned char val2cmp[2]; // То, с чем сравниваем



typedef struct {

unsigned char s1;

unsigned char s2;

} S2;



typedef union {

unsigned short sh;

unsigned char ch[2];

S2 s2;

} U3;



void compare(void)

{

U3 u3;

unsigned short sh;



// 1й способ

u3.sh=val2check;

if (u3.s2.s1==val2cmp[0] && u3.s2.s2==val2cmp[1]) ...



// 2й способ

u3.sh=val2check;

if (u3.ch[0]==val2cmp[0] && u3.ch[1]==val2cmp[1]) ...



// 3й способ

u3.sh=val2check;

if (memcmp(u3.ch,&val2cmp,sizeof(val2cmp)==0) ...



// 4й способ

if (memcmp(&val2check,&val2cmp,sizeof(val2cmp)==0) ...



// 5й способ

if ((val2check&0xFF)==val2cmp[0] && ((val2check>>8)&0xFF)==val2cmp[1]) ...



// 6й способ

if ( ((unsigned char*)&val2check)[0]==val2cmp[0] && ((unsigned char*)&val2check)[1]==val2cmp[1]) ...



// 7й способ

u3.s2.s1=val2cmp[0];

u3.s2.s2=val2cmp[1];

if (u3.sh==val2check) ...



// 8й способ

u3.ch[0]=val2cmp[0];

u3.ch[1]=val2cmp[1];

if (u3.sh==val2check) ...



// 9й способ

memcpy(u3.ch,val2cmp,sizeof(val2cmp));

if (u3.sh==val2check) ...



// 10й способ

sh=val2cmp[0]|(val2cmp[1]<<8);

if (sh==val2check) ...



// 11й способ

((unsigned char*)&sh)[0]=val2cmp[0];

((unsigned char*)&sh)[1]=val2cmp[1];

if (sh==val2check) ...



// 12й способ

if (*(unsigned short*)val2cmp == val2check) ...



}


Можно наверное и еще способов придумать, но надеюсь этих хватит
Go to the top of the page
 
+Quote Post
Visor
сообщение Mar 27 2008, 09:24
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428



Большое спасибо yaghtn, то что надо! beer.gif

Цитата(XVR @ Mar 27 2008, 15:58) *
На подавляющем большинстве современных процессоров "unsigned int" будет занимать 4 байта, что делать с оставшимися 2мя байтами из "unsigned int"?

Прошу прощения, не уточнил, речь идёт об AVR.

Спасибо всем отозвавшимся!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 10:45
Рейтинг@Mail.ru


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