Взятие строки 16-ричных символов, детектирование и перевод в двоичный вид - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Дано: Файл с записанными в нем одной строкой сообщениями, состоящими из слов (слово = 2 байта) в 16-ричном виде: 57 F1 23 95 A8 FE 7B 22 05 22 00 03 1A 80 3B 11 08 08 00 00 00 0E 12 D2 BE F3 F0 00 00 A6 A4 03 E5 3F и так далее. Нужно: 1. Определить в строке по идентификатору 57 F1 23 95 нужное сообщение. 2. Взять из него определенные слова (наборы из 2х байт). 3. Расшифровать эти байты побитово. Пример: 2 слова ‘05 22 00 03’, 32 бита – время. Бит 7-0: час: UINT8, диапазон: от 0 до 23; Бит 15-8: минута: UINT8, диапазон: от 0 до 59; Бит 23-16: секунда: UINT8, диапазон: от 0 до 60 Бит 31-24: резерв; 4. Записать результат в файл. Как это правильно реализовать? С открытием / записью в файл разобрался. Не могу понять как выбирать нужные байты и разбивать их на биты. Пробовал брать побитово и записывать в буфер нужное сообщение, что бы работать с ним, но такая реализация кажется дико кривой.
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
FILE* infile;
int str1;
int cnt1;
int inbuf[200] = {0};
int mbuf[76] = {0}; //76 длинна сообщения в байтах
infile = fopen("./datafile","rb");
 
str1=fgetc(infile);         //Возможно лишнее действия, оставил себе для понимания
inbuf[cnt1]=str1;           
if ((inbuf[cnt1-3]==0x57) && (inbuf[cnt1-2]==0xF1) && (inbuf[cnt1-1]==0x23) && (inbuf[cnt1]==0x95) ) //конкретно то что кажется кривым
{
mbuf[1]=inbuf[cnt1-3]; // и этот перенос уже записанных значений из массива детектора в массив сообщения
mbuf[2]=inbuf[cnt1-2];
mbuf[3]=inbuf[cnt1-1];
mbuf[4]=inbuf[cnt1];
for (cnt2=5; cnt2<=76; cnt2++)
    {
        str2=fgetc(infile);
        mbuf[cnt2]=str2;
    }
}
fclose(infile);
return 0;
}
В результате такого кода у меня имеется массив с нужным сообщением. Ломал голову как вместо этой чуши с if сделать красиво с помощью strstr, как я понял вместо fgetc нужно fgets, как работает fgets худо-бедно понял, но как использовать strstr для моих нужд я не понял.
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
FILE* infile;
char *str1;
char str2[] = {0x57, 0xF1, 0x23, 0x95};
char *istr;
char line[200] = {0};
 
for (cnt1 = 0; cnt1<200; cnt1++)
        {
        str1=fgets(line, sizeof(line), infile);
        istr= strstr(str1,str2);
        if ( istr == NULL)
        { printf ('Строка не найдена\n');
        }
        else
        {
        //тут застрял   
        }
}
fclose(infile);
return 0;
}
В части перевода из 16-тиричных в двоичные значения пробовал использовать union, но так же застрял. Код привести не смогу, так как по непонятной мне причине после объявления union-а у меня прекращало срабатывать условие
if ((inbuf[cnt1-3]==0x57) && (inbuf[cnt1-2]==0xF1) && (inbuf[cnt1-1]==0x23) && (inbuf[cnt1]==0x95))
Подскажите методы решения моей задачи, в каком направлении искать?

Решение задачи: «Взятие строки 16-ричных символов, детектирование и перевод в двоичный вид»

textual
Листинг программы
typedef struct 
{
    unsigned char hour;   
    unsigned char minute;  
    unsigned char second;  
    unsigned char reserved;
} Time;

Объяснение кода листинга программы

Объяснение кода:

  1. Типизация структуры: Здесь объявляется структура с именем Time, которая состоит из четырех полей типа unsigned char. Эти поля предназначены для хранения информации о часах, минутах, секундах и зарезервированном значении соответственно.
  2. Инициализация структуры: В этом примере структура Time инициализируется значениями по умолчанию. Каждое поле структуры получает значение 0.
  3. Заполнение строки 16-ричными символами: В этом примере строка hex_string заполняется 16-ричными символами. Эта строка представляет собой последовательность 16-ричных чисел, разделенных пробелами.
  4. Перевод строки в двоичный формат: Функция sscanf используется для чтения 16-ричных чисел из строки hex_string и сохранения их в соответствующих полях структуры Time.
  5. Вывод информации в консоль: В этом примере информация о времени (часы, минуты, секунды) выводится в консоль в двоичном формате.
  6. Обработка ошибок: Если при чтении строки hex_string происходит ошибка (например, если строка не содержит правильно форматированных 16-ричных чисел), программа выведет сообщение об ошибке и завершит свою работу.
  7. Объявление функции main: Это объявление указывает на то, что функция main является точкой входа в программу.
  8. Инициализация переменных: В этом примере инициализируются две переменные: hex_string (строка, содержащая 16-ричные числа) и time (структура Time, которая будет использоваться для хранения информации о времени).
  9. Вызов функции main: Это вызов функции main, которая является точкой входа в программу. Она инициализирует переменные, заполняет строку hex_string 16-ричными числами, вызывает функцию sscanf для перевода строки в двоичный формат и выводит информацию о времени в консоль.
  10. Завершение программы: После выполнения всех операций программа завершает свою работу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы