Взятие строки 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. Записать результат в файл.
Как это правильно реализовать?
С открытием / записью в файл разобрался. Не могу понять как выбирать нужные байты и разбивать их на биты.
Пробовал брать побитово и записывать в буфер нужное сообщение, что бы работать с ним, но такая реализация кажется дико кривой.
В результате такого кода у меня имеется массив с нужным сообщением.
Ломал голову как вместо этой чуши с if сделать красиво с помощью strstr, как я понял вместо fgetc нужно fgets, как работает fgets худо-бедно понял, но как использовать strstr для моих нужд я не понял.
В части перевода из 16-тиричных в двоичные значения пробовал использовать union, но так же застрял. Код привести не смогу, так как по непонятной мне причине после объявления union-а у меня прекращало срабатывать условие
Подскажите методы решения моей задачи, в каком направлении искать?
#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; }
#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; }
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;
Объяснение кода листинга программы
Объяснение кода:
- Типизация структуры: Здесь объявляется структура с именем
Time
, которая состоит из четырех полей типаunsigned char
. Эти поля предназначены для хранения информации о часах, минутах, секундах и зарезервированном значении соответственно. - Инициализация структуры: В этом примере структура
Time
инициализируется значениями по умолчанию. Каждое поле структуры получает значение 0. - Заполнение строки 16-ричными символами: В этом примере строка
hex_string
заполняется 16-ричными символами. Эта строка представляет собой последовательность 16-ричных чисел, разделенных пробелами. - Перевод строки в двоичный формат: Функция
sscanf
используется для чтения 16-ричных чисел из строкиhex_string
и сохранения их в соответствующих полях структурыTime
. - Вывод информации в консоль: В этом примере информация о времени (часы, минуты, секунды) выводится в консоль в двоичном формате.
- Обработка ошибок: Если при чтении строки
hex_string
происходит ошибка (например, если строка не содержит правильно форматированных 16-ричных чисел), программа выведет сообщение об ошибке и завершит свою работу. - Объявление функции main: Это объявление указывает на то, что функция main является точкой входа в программу.
- Инициализация переменных: В этом примере инициализируются две переменные:
hex_string
(строка, содержащая 16-ричные числа) иtime
(структураTime
, которая будет использоваться для хранения информации о времени). - Вызов функции main: Это вызов функции main, которая является точкой входа в программу. Она инициализирует переменные, заполняет строку
hex_string
16-ричными числами, вызывает функциюsscanf
для перевода строки в двоичный формат и выводит информацию о времени в консоль. - Завершение программы: После выполнения всех операций программа завершает свою работу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д