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

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

Вопрос чисто по си.

Знаю что писалось уже тысячу раз, но отыскать так и не получилось :(

есть некоторая переменная char temp

нужно условие что старшая тетрада (старшие четыре бита) например равнялись 2

тоесть что-то типа

if (temp ?? 0x20) {}

как сделать?

Подскажите пожалуйста.

Что старшая тетрада равна 2

Спасибо!

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


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

Вопрос чисто по си.

Для чисто по 'C' есть буквари и на крайний случай раздел программирования для начинающих.

 

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


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

(temp >> 4 ) == 2

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

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


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

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

Из-за того, что тип char?

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


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

Из-за того, что тип char?
Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа).

 

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


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

Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа).

Ну я это и имел ввиду. Убедиться решил, что правильно думаю :)

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


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

А таким способом пользоваться не следует.

Совершено нормальный способ. Надо смотреть, что эффективнее ложится на систему команд и оптимизируется. Для, например, старших тетрад 32битников подобный вариант предпочтительней.

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

Проблема ведь не в том, с чем сравнивать, а что сравнивать. Тут со знаком действительно проблема, но скорее всего, автору НУЖНО использовать вместо отданного на откуп компилятору типу char, unsigned тип. Кроме того, сейчас уже char по умолчанию обычно беззнаковый и компилятору можно указать использовать беззнаковый char. Ну или, если уж действительно вдруг нужна работа с signed char или с любым вариантом, то явные преобразования еще никто не отменял.

(temp >> 4 ) == (char)0xF0 >> 4;

будет работать всегда.

 

 

 

 

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


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

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

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

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

 

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

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

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

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


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

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

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

Для такой короткой последовательности наиболее оптимально решение "в лоб":

1. Ищется значение 0x64

2 Проверяем, что следующий байт равен 0xC0, а за ним идёт 0x66. Если - нет, то на п.1

 

 

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


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

Для такой короткой последовательности наиболее оптимально решение "в лоб":

1. Ищется значение 0x64

2 Проверяем, что следующий байт равен 0xC0, а за ним идёт 0x66. Если - нет, то на п.1

На словах я это представляю...

 

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

 

temp=0;

do {temp++;}

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

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

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


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

Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь
Да, примерно - так. Осталось дополнить выходом из цикла при условии, что весь массив byte был просмотрен, но совпадений не обнаружено.

 

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


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

Да, примерно - так. Осталось дополнить выходом из цикла при условии, что весь массив byte был просмотрен, но совпадений не обнаружено.

Да, верно, это тоже нужно учесть!

Спасибо! :)

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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