Как сравнить шестнадцатеричные значения с помощью C? - PullRequest
6 голосов
/ 14 октября 2011

Я работаю с шестнадцатеричными значениями.До сих пор я знаю, как печатать шестнадцатеричные значения, а также точность.Теперь я хочу сравнить шестнадцатеричные значения.Например, я читаю данные из файла в буфер символов.Теперь я хочу сравнить шестнадцатеричное значение данных в буфере.Есть что-нибудь подобное?

if  hex(buffer[i]) > 0X3F  
then
//do somthing

Как я могу это сделать?

Ответы [ 5 ]

13 голосов
/ 14 октября 2011

Вы почти на месте:

if (buffer[i] > 0x3f)
{
    // do something
}

Обратите внимание, что нет необходимости "конвертировать" что-либо в шестнадцатеричное - вы можете просто напрямую сравнивать символьные или целочисленные значения, так как шестнадцатеричная константа, такая как 0x3f,просто еще один способ представления целочисленного значения.0x3f == 63 (десятичное число) == ASCII '?'.

5 голосов
/ 14 октября 2011

Числа в компьютере - все 0 и 1. Глядя на них по основанию 10, или по основанию 16 (в шестнадцатеричном формате), или как символ (например, «а») не меняет число.

Итак, для сравнения с гексом вам не нужно ничего делать.

Например, если у вас есть

int a = 71;

Тогда следующие два утверждения эквивалентны:

if (a == 71)

и

if (a == 0x47)
4 голосов
/ 14 октября 2011

Да, вы можете:

 if  (buffer[i] > 0x3F)

(обратите внимание на строчную букву x). Редактировать Оказывается, 0X3F должно работать так же хорошо, но я испытываю желание сказать, что это не то, что обычно пишут программисты на Си).

1 голос
/ 29 ноября 2017

При сравнении символа с гексом вы должны быть осторожны:

Использование оператора == для сравнения символа с 0x80 всегда приводит к значению false?

Я бы рекомендовал этот синтаксис, введенный в C99, чтобы быть уверенным

if (buffer[i] > '\x3f')
{
    // do something
}

Он сообщает компилятору, что 0x3f - это символ, а не int (безопасность типов), иначе, скорее всего, вы увидите проблему с этим сравнением.

На самом деле компилятор clang предупредит вас об этом:

сравнение константы 128 с выражением типа 'char' всегда ложно [-Werror, -Wtautological-constant-out-of-of-range-Compare]

0 голосов
/ 14 октября 2011

Шестнадцатеричные значения - это не новые типы данных, это просто другие числовые методы, такие как

int a = 10;

в шестнадцатеричной печати

printf("a in hex value %x ",a);

вывод

a in hex value A

в цикле if

if(a == 0xa)
    do something

в десятичном виде

printf("a in decimal value %d ",a);

вывод

a in hex value 10

в цикле if

if(a == 10)
    do something
...