Перейти к содержанию
    

Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь:

А подумать головой совсем нельзя было?

temp=0;

do {temp++;}

while ((byte[temp] != 0x64) | (byte[(temp+1)] != 0xC0) | (byte[(temp+2)] != 0x66));

Продолжайте дальше перебирать буквы и цифры, поскольку эти каракули, как минимум, неработоспособны, если массив начинается с искомой последовательности.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А подумать головой совсем нельзя было?

 

Продолжайте дальше перебирать буквы и цифры, поскольку эти каракули, как минимум, неработоспособны, если массив начинается с искомой последовательности.

Благо что последовательность где-то находится через 7-мь и далее символов...

Голова на ночь совсем ни как :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

$ cat el.c 
#include <stdlib.h>
#include <string.h>
#include <assert.h>

static void *eqpos(const void *buf, size_t buflen, const void *s, size_t slen)
{
if (slen > buflen)
	return NULL;
for (size_t i = 0; i <= (buflen - slen); i++) {
	char *pos = (char *)buf + i;
	if (memcmp(pos, s, slen) == 0)
		return pos;
}
return NULL;
}

int main()
{
const char *buf = "deadbeefcafe";
size_t buflen = strlen(buf);
const char *s;

s = "d";
assert((buf + 0) == eqpos(buf, buflen, s, strlen(s)));

s = "dead";
assert((buf + 0) == eqpos(buf, buflen, s, strlen(s)));

s = "none";
assert(NULL == eqpos(buf, buflen, s, strlen(s)));

s = "tooooooooooolarge";
assert(NULL == eqpos(buf, buflen, s, strlen(s)));

s = "cafe";
assert((buf + sizeof("deadbeef") - 1) == eqpos(buf, buflen, s, strlen(s)));

assert(buf == eqpos(buf, buflen, buf, buflen));

exit(EXIT_SUCCESS);
}
$ gcc el.c -Wall -g -O0 -std=gnu99
$ ./a.out 
$

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

$ cat el.c 
#include <stdlib.h>
#include <string.h>
#include <assert.h>

static void *eqpos(const void *buf, size_t buflen, const void *s, size_t slen)
{
if (slen > buflen)
	return NULL;
for (size_t i = 0; i <= (buflen - slen); i++) {
	char *pos = (char *)buf + i;
	if (memcmp(pos, s, slen) == 0)
		return pos;
}
return NULL;
}

int main()
{
const char *buf = "deadbeefcafe";
size_t buflen = strlen(buf);
const char *s;

s = "d";
assert((buf + 0) == eqpos(buf, buflen, s, strlen(s)));

s = "dead";
assert((buf + 0) == eqpos(buf, buflen, s, strlen(s)));

s = "none";
assert(NULL == eqpos(buf, buflen, s, strlen(s)));

s = "tooooooooooolarge";
assert(NULL == eqpos(buf, buflen, s, strlen(s)));

s = "cafe";
assert((buf + sizeof("deadbeef") - 1) == eqpos(buf, buflen, s, strlen(s)));

assert(buf == eqpos(buf, buflen, buf, buflen));

exit(EXIT_SUCCESS);
}
$ gcc el.c -Wall -g -O0 -std=gnu99
$ ./a.out 
$

Спасибо :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

выставляет в единицу все биты кроме бита 2, 11111011

А что делает символ: ~ ?

А строчку (1 << 2)

Я понимал как взять единицу записать в младший разряд и сдвинуть влево на два бита .

Как так получилось что записать во все биты 1 ?

или (1 << 2) означает записать во все биты 1 кроме второго бита ?

Изменено пользователем ветерок

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что делает символ: ~ ?

А строчку (1 << 2)

Я понимал как взять единицу записать в младший разряд и сдвинуть влево на два бита .

Как так получилось что записать во все биты 1 ?

или (1 << 2) означает записать во все биты 1 кроме второго бита ?

~ - поразрядная инверсия.

так что ~(1<<2) - взять единицу, сдвинуть на 2 разряда влево и побитно проинвертировать результат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт.

То есть есть последовательность байт, например

......0x05 0x51 0x12 0x64 0xC0 0x66 0x41..................................................

 

И вот мне нужно найти начало последовательности 0x64 0xC0 0x66

Как это сделать? :smile3046:

Спасибо за внимание.

Почему бы вам не почитать Кнута? Это все такие базовые вещи, что просто стыдно должно быть их спрашивать.

 

А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным.

Для арма такой способ эффективнее, т.к. в нем сдвиг в любой инструкции к аргументу бесплатно можно применять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как правильно конвертировать шестнадцатиричное число в десятичное?

Другими словами.

Есть переменная int x

оно например имеет значение 1F

а мне нужно его преображзовать в 2 символа char (y,z). где x будет иметь значение 3, а z=1

то есть конвертировать hex в dec

Заранее спасибо всем откликнувшимся.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужно его преображзовать в 2 символа char (y,z). где x будет иметь значение 3, а z=1
В Вашем трансляторе отсутствует функция sprintf? Правда, она очень прожорлива к ресурсам МК... Для Вашего случая и собственную функцию написать не сложно. Что-то типа такого:

int x;
char s[2];
s[0]= x/10 + '0';
s[1]= x%10 + '0';

Здесь отсутствует проверка на знак числа х. Кроме того, не подавляется первый ноль, в случае если число х<10, и выдаст неверный результат, если x>99... Доработайте сами под Ваши нужды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Вашем трансляторе отсутствует функция sprintf? Правда, она очень прожорлива к ресурсам МК... Для Вашего случая и собственную функцию написать не сложно. Что-то типа такого:

int x;
char s[2];
s[0]= x/10 + '0';
s[1]= x%10 + '0';

Здесь отсутствует проверка на знак числа х. Кроме того, не подавляется первый ноль, в случае если число х<10, и выдаст неверный результат, если x>99... Доработайте сами под Ваши нужды.

Да, спасибо огромное.

Тут ещё вопрос назрел.

Как мне явно указать ячейку памяти в eeprom?

Тоесть в программе будет меняться значение переменной в eeprom. После включения мк должен считать значение из этой ячейки. В связи с чем вопрос.

Если я просто укажу ячейку как

eeprom char j;

И в программе она сменит значение. После нового включения я считаю значение переменной j из eeprom - она возъмёт из той же ячейки?

 

И правильно ли будет такой алгоритм. Есть таже переменная в памяти eeprom. В обработчике прерываний таймера который работает на высокой скорости я пишу, например:

if (j==0) {zz = 0;}

else {zz = 1;}

Просто насколько мне известно запись в eeprom занимает более 100 циклов тактового генератора. А вот чтение насколько быстро будет выполняться не знаю :(

Спасибо.

Изменено пользователем Павел_Б

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот эта строчка что делает ?

Скорее всего, имелось в виду DDRD &= ~(1 << 2);

Такая строчка сбрасывает нужный бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Genius1 спасибо

MrYuran ,да точно там такая строка

 

(1 << 2)

то есть такой сдвиг двигает единичку а после себя ноль оставляет ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...