Взятие строки 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_string16-ричными числами, вызывает функциюsscanfдля перевода строки в двоичный формат и выводит информацию о времени в консоль. - Завершение программы: После выполнения всех операций программа завершает свою работу.