Visor 0 27 марта, 2008 Опубликовано 27 марта, 2008 · Жалоба Имеется переменная "unsigned int" и байтовый массив, нужно сравнить эту переменную с двумя байтами из массива (например 0, 1), слово из этих байтов является "unsigned int". Как это красиво сделать? Посоветуйте хорошую книгу по Си и откуда скачать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axxel 0 27 марта, 2008 Опубликовано 27 марта, 2008 · Жалоба можно через union, любой учебник, подбельский например можно через сдвиг и XOR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yaghtn 0 27 марта, 2008 Опубликовано 27 марта, 2008 · Жалоба Имеется переменная "unsigned int" и байтовый массив, нужно сравнить эту переменную с двумя байтами из массива (например 0, 1), слово из этих байтов является "unsigned int". Как это красиво сделать? В общем случае, Си сам по себе не определяет порядок следования байт. Как пример: unsigned_int != ( (unsigned int)(chars[0]) << 8 | chars[1] ) Посоветуйте хорошую книгу по Си и откуда скачать? Гуглить по сигнатуре "Керниган Ричи" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 27 марта, 2008 Опубликовано 27 марта, 2008 · Жалоба Насколько я правильно понял, нужно попарно сравнивать байты массива char с числом uint? Я бы сделал так: char Mas[N]; // N - число элементов uint var; // сравниваемая величина uint *ptr; ... var=...; // присвоили значение ptr=&Mas[x]; // поставили указатель на нужный элемент в массиве if(var==*ptr)... // сравниваем В этом случае *ptr - это как раз uint значение, состоящее из 2-х байт массива Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 27 марта, 2008 Опубликовано 27 марта, 2008 · Жалоба Имеется переменная "unsigned int" и байтовый массив, нужно сравнить эту переменную с двумя байтами из массива (например 0, 1),На подавляющем большинстве современных процессоров "unsigned int" будет занимать 4 байта, что делать с оставшимися 2мя байтами из "unsigned int"? И как нужно сравнивать - на равенство или на больше/меньше? слово из этих байтов является "unsigned int". Как это красиво сделать?Лучше спроси сколькими способами это можно сделать :) (Предполагаю, что сравнивать нужно "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) ... } Можно наверное и еще способов придумать, но надеюсь этих хватит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Visor 0 27 марта, 2008 Опубликовано 27 марта, 2008 · Жалоба Большое спасибо yaghtn, то что надо! :beer: На подавляющем большинстве современных процессоров "unsigned int" будет занимать 4 байта, что делать с оставшимися 2мя байтами из "unsigned int"? Прошу прощения, не уточнил, речь идёт об AVR. Спасибо всем отозвавшимся! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться