Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 30.06.2023
Сообщений: 7

Классы для редактирования двоичного файла с настройками радиостанции

30.06.2023, 21:10. Показов 1357. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, есть задача: нужно редактировать файл. Есть программа для программирования радиостанций требуется ее переписать. Программа сохраняет файл в котором хранятся все настройки радиостанции. С помощью hex редактора "за реинженерил" файл определил назначение байтов в файле.

Теперь по теме:
-Есть допустим Каналы, вся информация о каждом из них содержится в 52 байтах со сдвигом 42588 байта от начала файла до первого канала, +52 для второго и тд. для последующих.

-Каждая единица информации может иметь разный тип и размер данных например, имя канала= string, частота= 3 байта в обратном порядке, мощность= 1 байт может быть 0 или 1(hight, low)

Вопрос в том как удобнее хранить такие данные в памяти или как в принципе это делается. Несколько идей:

1.
Создать класс chennal и создать в нем свои типы данных, много переменных разного типа и присваивать им значения по очереди в методе

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    enum ModulationType         //Модуляция
    {
        FM=1,
        DMR=3
    }
    enum Power
    {
        low=0,
        hight=1
    }
    enum PttState           //Запрет передачи
    {
        always=0,
        colorSame=1,
        channelFree=2
    }
    enum TimeSlot
    {
        t0=0,
        t1=1
    }
    ...
 
        public static int ch ;      //количество каналов
        public string name;     //имя канала
        public int number;  //номер канала от 0 до 2023, (ОБРАТНЫЙ)
        public ModulationType modulationType = new ModulationType();             //тип модуляции, 01=аналог FM, 03=DMR
        public Power power = new Power();                  //мощность передачи, 01=hight, 00=low
        public int freqRX;  //частота приема, (ОБРАТНЫЙ)
        public int freqTX;  //частота передачи, (ОБРАТНЫЙ)
        ...
таких переменных больше 40
В таком случае метод присваивающий значения получается длинный и корявый, постоянно приходится приводить типы
C#
1
2
3
...
channels[i].modulationType = (ModulationType)channels[i].temp[2]; //Модуляция
...
удобно что есть именованные причисления



2.
Создать массивы с данными, количеством байт для чтения и сдвигом

Примерно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        int[] quantity                      = new int[3] {0,2,42588};
 
        int[] number                        = new int[3] {0,1,42592};
        int[] modulationType                = new int[3] {0,1,42592};
        int[] power                         = new int[3] {0,1,42592};
        int[] freqRX                        = new int[3] {0,3,42592};
        int[] freqTX                        = new int[3] {0,3,42592};
        int[] numContakt                    = new int[3] {0,1,42592};
        int[] pttState                      = new int[3] {0,1,42592};
        int[] zero16                        = new int[3] {0,1,42592};
        int[] colorCode                     = new int[3] {0,2,42592};
        ...
Метод чтения файла получается короче, но вторая и третья переменная по сути должна быть константой(не рациональное использование памяти) а также не именование данные не удобно, и читать и записывать из вне класса в массивы как то не правильно.

3.
Создать класс в классе

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class chennal{
 
  class prop{
    public int data;
    public  char quantity;
    public  int offset;
 
  //конструктор 
    public prop (int z,x,c){
       data=z;
       quantity=x;
       offset=c;
 
    }
 }
 
   prop number = new prop { 0, 1, 42592 };
   prop modulationType = new prop { 0, 1, 42592 };
   prop power = new prop { 0, 1, 42592 };
   prop freqRX = new prop { 0, 1, 42592 };
}
Как хранят такие данные программисты? Спасибо заранее!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.06.2023, 21:10
Ответы с готовыми решениями:

Редактирования двоичного файла С++
Ребят, вот такая задача... Пишу курсовую работу и столкнулся с такой вот проблемой... Рассажу подробно =)) У меня есть двоичный файл,...

Есть ли готовые классы для редактирования видео
Есть в .NET какие нибудь? Не для отображения, а для редактирования. Надо файл mp4 преобразовать в набор картинок покадрово.

Ссылка для скачивания двоичного файла
Чтоб файл приложение для андроида *.apk скачивался, а не открывался в браузере сделал создал ссылку, указывающую на скрипт: <a...

29
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
01.07.2023, 00:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Lev1992 Посмотреть сообщение
Chennal
Откуда такое упорное неправильное написание Channel'а?
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.07.2023, 00:23
Цитата Сообщение от Lev1992 Посмотреть сообщение
Чем плох Chennal.FreqRX.data ???
Дальше вы будете делать скажем форму редактирования на WPF. Откинем всякие MVVM паттерны, и возьмем более простой вариант: у нас есть скажем ползунок от 100 до 200. С подходом когда int FreqRXData
C#
1
2
3
4
5
6
7
void ClickSave()
{
var channel = new();
channel.FreqRXData = названиеКонтрола.Value;
 
channelFileManager(fileTextBox.Text, new []{ channel  });
}
вариант с Chennal.FreqRX.data

C#
1
2
3
4
5
6
7
8
void ClickSave()
{
var channel = new();
var data = MaгияПоПреобразованиюIntToData(названиеКонтрола.Value);
channel.FreqRXData.data  = data;
 
channelFileManager(fileTextBox.Text, new []{ channel  });
}
MaгияПоПреобразованиюIntToData -- это "хвост", который придется таскать повсюду, вместо того чтобы "упаковать" его в channelFileManager.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
01.07.2023, 01:07
Все же приведу самый банальный пример, на всякий случай:
class Channel
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Channel
{
    private BitVector32 WCharacter; //32 bit total
 
    //Режем на "секции"...
    static BitVector32.Section _modulation = BitVector32.CreateSection(2);
    static BitVector32.Section _power = BitVector32.CreateSection(1, _modulation);
    static BitVector32.Section _pttState = BitVector32.CreateSection(2, _power);
    static BitVector32.Section _timeSlot = BitVector32.CreateSection(4, _pttState);
 
    public int Modulation   //2 bit
    {
        get => WCharacter[_modulation];
        set => WCharacter[_modulation] = value;
    }
 
    public int Power        //1 bit
    {
        get => WCharacter[_power];
        set => WCharacter[_power] = value;
    }
 
    public int PttState     //2 bit
    {
        get => WCharacter[_pttState];
        set => WCharacter[_pttState] = value;
    }
 
    public int TimeSlot     //4 bit
    {
        get => WCharacter[_timeSlot];
        set => WCharacter[_timeSlot] = value;
    }
 
 
    public Channel(int mod, int pow, int ptt, int tsl)
    {
        Modulation = mod;
        Power = pow;
        PttState = ptt;
        TimeSlot = tsl;
    }
 
    public override string ToString()
    {
        return $"Modulation:\t{Enum.GetName(typeof(Modulation), Modulation)}" +
            $"\nPower:  \t{Enum.GetName(typeof(Power), Power)}" +
            $"\nPttState:\t{Enum.GetName(typeof(PttState), PttState)}" +
            $"\nTimeSlot\t{Enum.GetName(typeof(TimeSlot), TimeSlot)}";
    }
}

C#
1
2
Channel channel = new(3, 1, 2, 5);
Console.WriteLine(channel);
Code
1
2
3
4
Modulation:     DRM
Power:          Hight
PttState:       ChannelFree
TimeSlot        T5
4 свойства в 9-ти битах!
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.07.2023, 02:01
wizard41,
1. не хватает публичного контракта к BitVector32 WCharacter, чтобы потом эти 9-бит таки плюхнуть в файл.
2. я бы такое использовал максимум для dto той части приложения, что будет отвечать за сохранение в файл.

Ну и как бы, ТС выше писал что он после редактуры будет скармливать файл другому приложению, так что там никаких объединений не получится провернуть, а придется следовать заложеному контракту.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
01.07.2023, 07:06
Цитата Сообщение от Wolfdp Посмотреть сообщение
не хватает публичного контракта к BitVector32 WCharacter,
Wolfdp, это всего лишь принцип (идея), а не конкретная часть реализации вопроса ТСа. Привел только потому, что про это сказал, на всякий случай.
Про модель данных Тса: ммм... плодить столько Enum'ов - как бы монструозно. Подозреваю, что это далеко не все еще. Тут надо что-то другое точно.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.07.2023, 08:43
Цитата Сообщение от wizard41 Посмотреть сообщение
плодить столько Enum'ов
Есть не просят. И я насчитал пол-десятка, много это назвать сложно. Зато вместо уловного rx\tx случайно не впихнешь не те значения. Не думаю, что с этим стоит заморачиватся.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
01.07.2023, 13:04
Цитата Сообщение от Wolfdp Посмотреть сообщение
я насчитал пол-десятка
Цитата Сообщение от Lev1992 Посмотреть сообщение
таких переменных больше 40
ТС не приводит нам "полный список"... Так что может быть пол-десятка, а может и пара десятков...
Енумы у него это константы, означающие что-то (FM,DMR... low, high...). Я бы предпочел, ну хотя бы список словарей... Динамичнее будет и удобнее извлекать.

Добавлено через 2 часа 16 минут
Вместо Enum'ов:
class Helper
C#
1
2
3
4
5
6
7
8
9
10
11
12
/// <summary> Класс с константами и их значениями </summary>
class Helper
{
    public static Dictionary<string, Dictionary<int, string>> ConstantData = new()
    {
        { "ModulationType", new() { { 1, "FM" }, { 3, "DMR" } } },
        { "Power",          new() { { 0, "low" }, { 1, "high" } } },
        { "PttState",       new() { { 0, "always" }, { 1, "colorSame" }, { 2, "channelFree" } } },
        { "TimeSlot",       new() { { 0, "T0" }, { 1, "T1" }, { 2, "T2" }, { 3, "T3" },
                                    { 4, "T4" }, { 5, "T5" }, }
        }};
}

class Channel
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Channel
{
    public string Name { get; set; }
    public int FreqRX { get; set; }
    public int FreqTX { get; set; }
    public int Modulation { get; set; }
    public int Power { get; set; }
    public int State { get; set; }
    public int TimeSlot { get; set; }
 
    public override string ToString()
    {
        return $"CHNL Name:\t{Name}\nFreq RX:\t{FreqRX} kHz\nFreq TX:\t{FreqTX} kHz\n" +
            $"Modulation:\t{Helper.ConstantData
            .Where(h => h.Key == "ModulationType")
            .Select(i => i.Value)
            .Where(o => o.ContainsKey(Modulation))
            .Select(x => x[Modulation])
            .First()}\n" +
            $"Power:  \t{Helper.ConstantData
            .Where(h => h.Key == "Power")
            .Select(i => i.Value)
            .Where(o => o.ContainsKey(Power))
            .Select(x => x[Power])
            .First()}\n" +
            $"PttState:\t{Helper.ConstantData
            .Where(h => h.Key == "PttState")
            .Select(i => i.Value)
            .Where(o => o.ContainsKey(State))
            .Select(x => x[State])
            .First()}\n" +
            $"TimeSlot:\t{Helper.ConstantData
            .Where(h => h.Key == "TimeSlot")
            .Select(i => i.Value)
            .Where(o => o.ContainsKey(TimeSlot))
            .Select(x => x[TimeSlot])
            .First()}";
    }
}

Класс Wolfdp ChannelFFileManager извлек очередную порцию данных какого-то канала:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//Буфер для данных одного канала, считанный из файла
byte[] one_each_channel;
 
/*
 * Допустим:
 * под имя канала выделено 20 байт
 * частота RX - 3 байта
 * частота TX - 3 байта
 * Modulation - 1 байт
 * мощность - 1 байт
 * PttState - 1 байт
 * TimeSlot - 1 байт
 */
 
/* Из файла считан блок данных канала... */
//Name = RADIO-3 EAST
//Freq RX = 1520
//Freq TX = 2480
//Modulation = 3 (DRM)
//Power = 1 (high)
//PttState = 2 (ChannelFree)
//TimeSlot = 4 (T4)
one_each_channel = new byte[] { 0x52, 0x41, 0x44, 0x49, 0x4F, 
                                0x2D, 0x33, 0x20, 0x45, 0x41,
                                0x53, 0x54, 0x20, 0x20, 0x20,
                                0x20, 0x20, 0x20, 0x20, 0x20,
                                0x05, 0x0F, 0x00, 0x09, 0x0B,
                                0x00, 0x03, 0x01, 0x02, 0x04 };
 
 
//Где-то дальше собираются классы Channel из прочитанных данных...
Channel channel = new()
{
    Name = Encoding.UTF8.GetString(one_each_channel, 0, 20),
    FreqRX = one_each_channel[20] << 8 | one_each_channel[21] << 4 | one_each_channel[22],
    FreqTX = one_each_channel[23] << 8 | one_each_channel[24] << 4 | one_each_channel[25],
    Modulation = one_each_channel[26],
    Power = one_each_channel[27],
    State = one_each_channel[28],
    TimeSlot = one_each_channel[29]
};
 
Console.WriteLine(channel.ToString());
Console.Read();
Смотрим инфо канала:
Code
1
2
3
4
5
6
7
CHNL Name:      RADIO-3 EAST
Freq RX:        1520 kHz
Freq TX:        2480 kHz
Modulation:     DMR
Power:          high
PttState:       channelFree
TimeSlot:       T4
Любые изменения в каком-то канале должны попадать на свои места в файле... Это тоже забота класса ChannelFFileManager.
Примерно так.

P.S. У ТС довольно большая структура в итоге. Я бы, в добавок, разделил ее еще, на более логические части, а не совал все в одну кучу. И приведена только часть свойств из 40+. Что там еще будет неизвестно.
0
0 / 0 / 0
Регистрация: 30.06.2023
Сообщений: 7
03.07.2023, 21:26  [ТС]
Спасибо, про Dictionary<> вообще не знал, я так понял к словарям только по ключу можно обращаться.

Вот если бы так можно было:

Dictionary<string, int> ConstantData = new{"First",1};

int temp = ConstantData["First"];
string temp2 = ConstantData[1];
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
03.07.2023, 21:46
Lev1992, ничто не мешает вам написать свой класс коллекции с таким функционалом.
1
 Аватар для XIST
1968 / 1077 / 149
Регистрация: 01.10.2009
Сообщений: 3,643
Записей в блоге: 1
03.07.2023, 22:38
Lev1992, нет ничего невозможного если я правильно понял
C#
1
2
int temp = ConstantData["First"];
string bububu = ConstantData.ElementAt(temp -1).Key;
это если у вас value как ключ (но если и не ключ варианты есть), можно всё красиво сделать, но это чуток будет с подвыподвертом, легче свой класс или список
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.07.2023, 22:38

Переделать программу для двоичного файла
Помогите, пожалуйста переделать программу для двоичного файла) Буду очень признателен за помощь. Большое спасибо тем кто откликнется....

Алгоритм для программы по вычислению двоичного логарифма двоичного числа в машине Тьюринга
Помогите придумать алгоритм для программы по вычислению двоичного логарифма двоичного числа в машине тьюринга

Не корректно работает гиперссылка для открытия файла в PhotoShop для редактирования
Всем доброго времени суток! Возникла проблемка с гиперссылкой в access. Дело в том, что при нажатии на нее мною подразумевалось...

Чтение двоичного файла для последующей расшифровки DPAPI
Здравствуйте! Уже достаточно долго пытаюсь расшифровать зашифрованный с помощью DPAPI файл. Зашифровать проблем не составляет, а вот с...

Чтение двоичного файла для последующей расшифровки DPAPI
Здравствуйте! Уже достаточно долго пытаюсь расшифровать зашифрованный с помощью DPAPI файл. Зашифровать проблем не составляет, а вот с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru