Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 11.07.2012
Сообщений: 6

Разбор бинарного файла

23.01.2013, 15:33. Показов 5993. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Пытаюсь прочитать бинарный файл с информацей об станционных измерениях нагрузки. Структура проблизительно такова: первые 6 байт (03 00 00 00 00 00) обозначают начало нового измерения, потом 2 байта не знаю что, затем 6 байт собственно название измерения, далее дата-время и потом сами данные измерений. Затем цикл повторяется, причем длина данных измерений(цикла) разная. Информация по этой теме, которую перечитал, ничего путнего не подсказала. Обычно примеры ограничиваются элементарными операциями записи-чтения в бинарник, без анализа данных и т.п. Прочитал про сериализацию, идея нравится, но как её сюда применить не знаю. Возможно есть и другие красивые решения. Не хочется думать, что единственный выход - это тупой перебор.
Собственно прошу направить в нужное русло(идею). Если ещё и с примером кода, то вообще шикарно.
Бинарный файл прилагаю.
Спасибо.
Вложения
Тип файла: txt loc.txt (1.4 Кб, 42 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2013, 15:33
Ответы с готовыми решениями:

Разбор бинарного изображения в качестве массива из 0 и 1
Доброго времени суток, форумчане! нужна консультация или непосредственный пример в следующем вопросе: я загружаю бинарное изображение в...

Разбор бинарного файла чанками
И так, доброго времени суток уважаемые форумчане. Собственно задача такова, надо считать файл следующего формата. enum SkeletonChunkID...

Создание бинарного дерева из бинарного файла
struct Bin { string name; string city; int players; int score; }; void ReadFromBin(Point*& Tree) { Bin q;

9
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.01.2013, 19:31
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
        static void Main ( string[] args )
        {
            var list = UnknownFileManager.ReadFile( @"X:\2\loc.txt" );
        }
 
        class UnknownFileData
        {
            private string mName;
 
            public string Name
            {
                get { return mName; }
                set
                {
                    if ( value == null )
                        throw new ArgumentNullException();
 
                    if ( value.Length > 6 )
                        value = value.Substring( 0, 6 );
 
                    mName = value;
                }
            }
 
            public DateTime DateTime { get; set; }
            public byte[] BinaryData { get; set; }
        }
 
        static class UnknownFileManager
        {
            const int DATA_OFFSET = 
                6 + // ID length
                2 + // Total chunk length
                6 + // Name length
                8;  // Date (type of long, by default)
 
            static readonly byte[] ValidHeader = new byte[] { 0x3, 0x0, 0x0, 0x0, 0x0, 0x0 };
 
            public static List<UnknownFileData> ReadFile ( string fileName )
            {
                var list = new List<UnknownFileData>();
 
                using ( var fileStream = File.Open( fileName, FileMode.Open, FileAccess.Read ) )
                {
                    var br         = new BinaryReader( fileStream, Encoding.Default );
                    var dataLength = 0;
 
                    while ( true )
                    {
                        if ( !CheckHeader( br.ReadBytes( 6 ) ) )
                            throw new InvalidDataException( "Invalid header!" );
                        if ( fileStream.Position >= fileStream.Length )
                            break; // EOF
 
                        var unknownData = new UnknownFileData();
                        dataLength = br.ReadUInt16() - DATA_OFFSET;
 
                        unknownData.Name = new string( br.ReadChars( 6 ) );
                        unknownData.DateTime = DateTime.FromBinary( br.ReadInt64() );
                        unknownData.BinaryData = br.ReadBytes( dataLength );
 
                        list.Add( unknownData );
                    }
                }
 
                return list;
            }
 
            static bool CheckHeader ( byte[] header )
            {
                if ( header == null || header.Length < 6 )
                    return false;
 
                for ( int i = 0; i < 6; ++i )
                    if ( header[i] != ValidHeader[i] )
                        return false;
 
                return true;
            }
        }
Сохранение как-нибудь сами, ну или конкретные вопросы задавайте.
1
2 / 2 / 0
Регистрация: 11.07.2012
Сообщений: 6
24.01.2013, 15:37  [ТС]
Спасибо огромное. Работает. Полностью понять код мне не по силам, уровень не тот. Вопросов много, наберусь наглости некоторые задать. Понятно, что результаты пишутся в массив "list.Add(unknownData)", непонятно как к ним получить доступ. Допустим, что должно быть в скобках "richTextBox1.AppendText(?????)"?
Можно в массив сразу писать десятичные числа, а не unknownData.BinaryData? Меня они в основном и интересуют.
Возможно мои вопросы покажутся детскими, но к сожалению время и уровень не позволяют мне самостоятельно разобраться.
Еще раз спасибо.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
24.01.2013, 17:35
C#
1
richTextBox1.AppendText(list[0 /* номер элемента в массиве */].Name /* например, для вывода имени элемента */);
Цитата Сообщение от Zarovino Посмотреть сообщение
Можно в массив сразу писать десятичные числа, а не unknownData.BinaryData
Вы знаете в каком представлении хранятся числа в файле? (Int32 или Int16 или Byte)
Если Byte, то получить значение можно так:
C#
1
byte value = list[/* номер элемента */].BinaryData[/* номер байта в массиве */];
Записать так:
C#
1
list[/* номер элемента */].BinaryData[/* номер байта в массиве */] = /* значение */;
Если значения хранятся как Int32 или Int16, то чтение будет немного другим способом происходить.

p.s. Подозреваю что значения хранятся либо как Byte, либо как Int16, т.к. длина данных не всегда кратна 4 (размер Int32).
1
2 / 2 / 0
Регистрация: 11.07.2012
Сообщений: 6
29.01.2013, 13:16  [ТС]
Всё таки хочу добить тему. Сначала не обратил внимание, а дата то выводится не та (06.08.0012 8:45:08). Думаю это из-за того, что для даты-времени анализируется 8 байт, а нужно 12. Обыскал интернет, решения не нашёл, вообще эта тема задвинута почему-то. Как бы Вы решили эту задачу?
Спасибо.
P.S.
Пробовал так:
C#
1
2
double date = br.ReadDouble();
DateTime dataTime = DateTime.FromOADate(date);
результат: 30.12.1899 0:00:00
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2013, 14:41
Цитата Сообщение от Zarovino Посмотреть сообщение
нужно 12
Почему Вы так решили? Есть какая-то документация?
Цитата Сообщение от Zarovino Посмотреть сообщение
Пробовал так:
double - 8 байт.

Желательно знать какая/как дата записывалась, иначе можно долго гадать.

Добавлено через 43 минуты
Если это значение даты "15:06:40 30.04.1992" похоже на реальность, то могу переписать код...
0
2 / 2 / 0
Регистрация: 11.07.2012
Сообщений: 6
29.01.2013, 15:00  [ТС]
Я точно знаю дату и время создания файла: 15.01.13 11:15 и это соответствует диапазону с 21 байта (0хD)-год по 30-й (0хF)-минуты. То, что следующие 2 байта секунды - не уверен.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2013, 15:17
Структура приблизительно такая:
Code
1
AA AA AA AA AA AA ?? ?? ?? ?? ?? ?? YY YY MM MM DD DD HH HH mm mm (SS SS)
AA - название
?? - неизвестные данные (не разбирался), вроде как везде повторяются (00 00 00 00 2A 00)
YY - год
MM - месяц
DD - день
HH - час
mm - минуты
SS - возможно секунды, т.к. везде присустсвуют (позже, может, посмотрю точнее), а возможно и нет, т.к. всегда одно значение (04 00 00 00) - слишком много для секунд.

Потом данные всегда разные.

Код написать пока нет возможности...

Добавлено через 7 минут
Можно узнать откуда эти файлы берутся (что за программа)? И если еще есть файлы, то было-бы неплохо их посмотреть (1-2 файла должно хватить).
0
2 / 2 / 0
Регистрация: 11.07.2012
Сообщений: 6
29.01.2013, 15:59  [ТС]
Это файл станционных измерений нагрузки трафика. Нагрузка меряется с периодом 15 минут. Формируются или станцией, или прикрученной к ней программой. Точно не скажу. Получил наследство без особого описания, приходится разбираться самому. Есть текстовый файл с готовыми результатами, но мне нужен свой парсер. В приложении 2 бинарника и текстовый, в нем все 15-минутки за текущие сутки. Последние 6 строк - это содержимое прилагаемых бинарников.
Вложения
Тип файла: rar 1.rar (4.3 Кб, 7 просмотров)
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2013, 22:42
В общем вот что пока получилось выяснить:
  • Вот структура одного chunk'а: (файл для программы Hex Workshop, там используется синтаксис C/C++ для описания структур, поэтому должна быть понятна основная суть)
    Кликните здесь для просмотра всего текста
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    
    /*
     * LOC
     * ~ .: ---------------------- :. ~
     * chunk - одна структура tagHEADER
     * XXX::YYY - структура::поле
     */
     
    #pragma byteorder(little_endian);
    #pragma displayname("LOC format");
     
    #include "standard-types.hsl"
     
    #pragma hide();
    typedef struct tagDATETIME
    {
        USHORT Year;
        USHORT Month;
        USHORT Day;
        USHORT Hour;
        USHORT Minute;
    } DATETIME;
     
    typedef struct tagUNKNOWN_HEADER_MIDDLE
    {
        DWORD  u0;  // DWORD т.к. всегда четыре 0, меняются только следующие 2 байта
        USHORT u1;  // Меняется в каждом файле, во всех chunk'ах одно значение
    } UNKNOWN_HEADER_MIDDLE;
     
    typedef struct tagUNKNOWN_HEADER_END
    {
        USHORT u0;  // Замечено только одно значение: 4 (врядли это секунды)
        USHORT u1;  // Замечено только одно значение: 0
        USHORT u2;  // Значение равное длине данных + 10: sizeof(tagBUFFER) + 10
        USHORT u3;  // Меняется в chunk'ах, но совпадает во всех файлах для каждого chunk'а по порядку
        USHORT u4;  // Замечено только одно значение: 1
    } UNKNOWN_HEADER_END;
     
    typedef struct tagBUFFER
    {
        BYTE    Value[
                    __getUWordAt(__getAddrOf(__parent__) + 6) -
                    (6 + // sizeof(tagHEADER::Header)
                    2 +  // sizeof(tagHEADER::Length)
                    6 +  // sizeof(tagHEADER::Name)
                    6 +  // sizeof(tagUNKNOWN_HEADER_MIDDLE)
                    10 + // sizeof(tagDATETIME)
                    10)  // sizeof(tagUNKNOWN_HEADER_END)
                    ];
    } BUFFER;
    #pragma show();
     
    typedef struct tagHEADER
    {
        BYTE                    Header[6];
        
        // Проверка заголовка
        #pragma verify match_var_int("Header[0]", "0x3")
        #pragma verify match_var_int("Header[1]", "0x0")
        #pragma verify match_var_int("Header[2]", "0x0")
        #pragma verify match_var_int("Header[3]", "0x0")
        #pragma verify match_var_int("Header[4]", "0x0")
        #pragma verify match_var_int("Header[5]", "0x0")
        // end header verify
        
        USHORT                  Length;
        CHAR                    Name[6];
        UNKNOWN_HEADER_MIDDLE   Unknown0;
        DATETIME                Date;
        UNKNOWN_HEADER_END      Unknown1;
        BUFFER                  Buffer;
    } HEADER;
     
    // Чтение всех chunk'ов в файле
    function ReadAllChunks
    {
        DWORD pos = 0x0;
        DWORD end = __getDocSize() - 6 /* sizeof(HEADER::Header) */ ;
        
        while( pos < end )
        {
            pos += __addStructureAt(pos, "HEADER", "");
        }
    }
  • Чтение структуры на C#:
    Кликните здесь для просмотра всего текста
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    
            struct UNKNOWN_HEADER_MIDDLE
            {
                public uint u0;
                public ushort u1;
            }
     
            struct UNKNOWN_HEADER_END
            {
                public ushort u0;
                public ushort u1;
                public ushort u2;
                public ushort u3;
                public ushort u4;
            }
     
            class UnknownFileData
            {
                private string mName;
     
                public string Name
                {
                    get { return mName; }
                    set
                    {
                        if ( value == null )
                            throw new ArgumentNullException();
     
                        if ( value.Length > 6 )
                            value = value.Substring( 0, 6 );
     
                        mName = value;
                    }
                }
     
                public UNKNOWN_HEADER_MIDDLE Unknown0;
                public DateTime DateTime { get; set; }
                public UNKNOWN_HEADER_END Unknown1;
                public byte[] BinaryData { get; set; }
            }
     
            static class UnknownFileManager
            {
                const int DATA_OFFSET = 
                    6 +  // ID length
                    2 +  // Total chunk length
                    6 +  // Name length
                    6 +  // UNKNOWN_HEADER_MIDDLE
                    10 + // DateTime (10 bytes)
                    10;  // UNKNOWN_HEADER_END
     
                static readonly byte[] ValidHeader = new byte[] { 0x3, 0x0, 0x0, 0x0, 0x0, 0x0 };
     
                public static List<UnknownFileData> ReadFile ( string fileName )
                {
                    var list = new List<UnknownFileData>();
     
                    using ( var fileStream = File.Open( fileName, FileMode.Open, FileAccess.Read, FileShare.Read ) )
                    {
                        var br         = new BinaryReader( fileStream, Encoding.Default );
                        var dataLength = 0;
     
                        while ( true )
                        {
                            if ( !CheckHeader( br.ReadBytes( 6 ) ) )
                                throw new InvalidDataException( "Invalid header!" );
                            if ( fileStream.Position >= fileStream.Length )
                                break; // EOF
     
                            var unknownData = new UnknownFileData();
                            dataLength = br.ReadUInt16() - DATA_OFFSET;
     
                            unknownData.Name = new string( br.ReadChars( 6 ) );
                            // .: UNKNOWN_HEADER_MIDDLE :.
                            unknownData.Unknown0.u0 = br.ReadUInt32();
                            unknownData.Unknown0.u1 = br.ReadUInt16();
                            // ---
                            unknownData.DateTime = new DateTime(
                                                        br.ReadUInt16(), // Year
                                                        br.ReadUInt16(), // Month
                                                        br.ReadUInt16(), // Day
                                                        br.ReadUInt16(), // Hour
                                                        br.ReadUInt16(), // Minute
                                                        0 /* Seconds, always zero */)
                                                        .AddYears( 2000 );
                            // .: UNKNOWN_HEADER_END :.
                            unknownData.Unknown1.u0 = br.ReadUInt16();
                            unknownData.Unknown1.u1 = br.ReadUInt16();
                            unknownData.Unknown1.u2 = br.ReadUInt16();
                            unknownData.Unknown1.u3 = br.ReadUInt16();
                            unknownData.Unknown1.u4 = br.ReadUInt16();
                            // ---
                            unknownData.BinaryData = br.ReadBytes( dataLength );
     
                            list.Add( unknownData );
                        }
                    }
     
                    return list;
                }
     
                static bool CheckHeader ( byte[] header )
                {
                    if ( header == null || header.Length < 6 )
                        return false;
     
                    for ( int i = 0; i < 6; ++i )
                        if ( header[i] != ValidHeader[i] )
                            return false;
     
                    return true;
                }
            }
  • Вывод в консоль:
    Кликните здесь для просмотра всего текста
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    
            static void Main ( string[] args )
            {
                const int COLUMNS = 16;
                var list = UnknownFileManager.ReadFile( @"X:\loc1.txt" );
     
                for ( int i = 0; i < list.Count; ++i )
                {
                    var item = list[i];
                    var length = item.BinaryData.Length;
                    // Main info
                    Console.WriteLine(
                        "{0}.\tName: {1}\r\n\tDate: {2}\r\n\tBinary: {3} (Mod2: {4}, Mod4: {5})\r\n\t",
                        (i + 1), item.Name, item.DateTime, length,
                        (length & 0x1) != 0x1 ? "Yes" : "No",
                        (length % 4) == 0x0 ? "Yes" : "No"
                        );
     
                    DumpUnknownFields( item );
                    DumpBin( item.BinaryData, COLUMNS );
                }
     
                Console.WriteLine( "Press any key to end..." );
                Console.ReadKey();
            }
     
            static void DumpUnknownFields ( UnknownFileData unknownFileData )
            {
                Console.WriteLine(
                    "\tUNKNOWN_HEADER_MIDDLE:\r\n\t\tu0[4]: {0}\r\n\t\tu1[2]: {1}",
                    unknownFileData.Unknown0.u0, unknownFileData.Unknown0.u1
                    );
                Console.WriteLine(
                    "\tUNKNOWN_HEADER_END (2 bytes all):\r\n\t\tu0: {0}\r\n\t\tu1: {1}\r\n\t\tu2: {2}\r\n\t\tu3: {3}\r\n\t\tu4: {4}\r\n",
                    unknownFileData.Unknown1.u0, unknownFileData.Unknown1.u1, unknownFileData.Unknown1.u2, unknownFileData.Unknown1.u3,
                    unknownFileData.Unknown1.u4
                    );
            }
     
            static void DumpBin ( byte[] buffer, int columns )
            {
                var length = buffer.Length;
                var rows = length / columns;
                var csColor = ConsoleColor.White;
     
                // Table header
                Console.Write( "\t  №  | " );
     
                csColor = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.DarkGreen;
                for ( int j = 0; j < columns; ++j )
                    Console.Write( "{0:X2} ", j );
                Console.ForegroundColor = csColor;
     
                Console.WriteLine( "|\r\n\t " + new string( '-', 7 + 3 * columns ) );
                // Table content
                // YYY | XX XX XX ...
                // YYY - row number
                // XX  - binary data
                for ( int j = 0; j < rows; ++j )
                {
                    Console.Write( "\t " );
                    csColor = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.Write( "{0:X3}", j * columns );
                    Console.ForegroundColor = csColor;
                    Console.Write( " | " );
     
                    for ( int k = 0; k < columns; ++k )
                        Console.Write( "{0:X2} ", buffer[j * columns + k] );
                    Console.Write( "|\r\n" );
                }
                // Last row
                // >>> | XX XX XX ...
                // >>> - end row
                // XX  - binary data
                if ( (rows = (length - (rows * columns))) > 0 && rows < columns )
                {
                    Console.Write( "\t " );
                    csColor = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write( ">>>" );
                    Console.ForegroundColor = csColor;
                    Console.Write( " | " );
     
                    for ( int j = rows; j > 0; --j )
                        Console.Write( "{0:X2} ", buffer[length - j] );
                    Console.WriteLine();
                }
     
                Console.WriteLine();
            }

Всё вместе в архиве:
Вложения
Тип файла: rar research.rar (2.4 Кб, 20 просмотров)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.01.2013, 22:42
Помогаю со студенческими работами здесь

Создание бинарного дерево из бинарного файла
struct Bin { string name; string city; int players; int score; }; void ReadFromBin(Point*&amp; Tree) { ...

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

Получение хеша бинарного файла сборки для выполняемого apk-файла
Cкажите, пожалуйста, как можно обратиться, получить доступ и рассчитать хеш бинарного файла одной из сборок, хранящейся в папке Managed,...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Разбор файла
Перед выполнением задания создать файл data.txt с не менее 15 записей по своему варианту. Результаты выполнения программы не выводить на...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru