Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 9

CryptographicException: Недопустимая длина данных для шифрования

05.05.2021, 00:52. Показов 4207. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На Java без проблем работает.

Java
1
2
3
4
5
6
7
8
9
public static byte[] get(SecretKey key, byte[] data) throws Exception {
        SecureRandom rand = new SecureRandom();
        byte[] iv0= new byte[16];
        rand.nextBytes(iv0);
        IvParameterSpec iv = new IvParameterSpec(iv0);
        Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
        cipher.init(1, key, iv );
        return cipher.doFinal(data);
    }
А вот на c# проблема.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            try
            {
                RijndaelManaged aes = new RijndaelManaged();
      
                aes.Mode = CipherMode.CFB;
                aes.Padding = PaddingMode.None ;
                aes.Key =  Encoding.UTF8.GetBytes(Key);
                aes.GenerateIV();
 
                ICryptoTransform encrypto = aes.CreateEncryptor();
 
                byte[] plainTextByte = Encoding.UTF8.GetBytes(plainText);
   
                return encrypto.TransformFinalBlock(plainTextByte, 0, plainTextByte.Length);;       
                       
            }
            catch (Exception ex) 
            {
                Console.WriteLine(ex.ToString());
            }
Ошибка при одних и тех же входных данных:
System.Security.Cryptography.Cryptograph icException: Недопустимая длина данных для шифрования.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2021, 00:52
Ответы с готовыми решениями:

Недопустимая длина данных для дешифрования
Привет! Шифрование идет как по маслу (в моём случае огромная xml - разметка), а вот при дешифровке выдает ошибку: "Недопустимая...

"Недопустимая длина данных для дешифрования" при использовании AES
Всем привет. Столкнулся с проблемой шифрования. Вот ресурс: http://easylab.net.ua/net-c-windows-forms/c-algoritm-shifrovaniya-aes ...

Недопустимая длина данных для дешифрованния
Помогите понять, что я делаю не так. С Десяток раз проверил на примерах... Все времы вылазит ошибка: Недопустимая длина данных для...

19
13 / 10 / 3
Регистрация: 29.03.2018
Сообщений: 95
05.05.2021, 15:31
Длина шифруемых данных должна быть кратна 128 битам (16 байтам).
Как устроен AES

Добавлено через 9 минут
Так жe в комментариях к классу это указано: RijndaelManaged Класс
0
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 9
05.05.2021, 21:12  [ТС]
Цитата Сообщение от Dimasikkk1 Посмотреть сообщение
Длина шифруемых данных должна быть кратна 128 битам (16 байтам).
Как устроен AES
Добавлено через 9 минут
Так жe в комментариях к классу это указано: RijndaelManaged Класс
Тогда почему Java это хавает ?
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
06.05.2021, 05:34
Потому что джава разбивает данные на куски внутри этого класса cipher. Что за глупые вопросы.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
06.05.2021, 16:04
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Что за глупые вопросы.
Ну, если ты вчерашний студент, такой вопрос очень даже возможен.

По теме: дабы не развлекатся с блоками, в C# существует понятие Stream. Возможно решение задачи через CryptoStream будет удобней-правильнее.
1
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 9
07.05.2021, 00:11  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Ну, если ты вчерашний студент, такой вопрос очень даже возможен.
По теме: дабы не развлекатся с блоками, в C# существует понятие Stream. Возможно решение задачи через CryptoStream будет удобней-правильнее.
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
public static byte[] crypto (long src, string Key) 
        {
            String plainText = src.ToString();
 
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Padding = PaddingMode.None;
                aesAlg.Mode = CipherMode.CFB;
                aesAlg.Key = Encoding.UTF8.GetBytes(Key);
                aesAlg.GenerateIV();
 
                byte[] asd = aesAlg.IV;
                byte[] txt = Encoding.UTF8.GetBytes(plainText);
 
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
 
                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            //Write all data to the stream.  
 
                            swEncrypt.Write(plainText);
                        }
 
                        return msEncrypt.ToArray();                
 
                    }
                }
            }
        }
Изначально так и пробовал.
Только проблема, в том что шифровать нужно long 1234567891012 (13 byte)
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
07.05.2021, 00:26
Цитата Сообщение от 0racle Посмотреть сообщение
Только проблема, в том что шифровать нужно long 1234567891012 (13 byte)
Вообще-то long 8 байт... И зачем число в строку, потом строку в байты преобразовывать не понятно... Можно же число сразу в байты конвертировать...

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
        public static byte[] crypto(long src, string Key)
        {
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Padding = PaddingMode.None;
                aesAlg.Mode = CipherMode.CFB;
                aesAlg.Key = Encoding.UTF8.GetBytes(Key);
                aesAlg.GenerateIV();
 
                byte[] data = BitConverter.GetBytes(src);
 
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
 
                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        csEncrypt.Write(data);
                        return msEncrypt.ToArray();
                    }
                }
            }
        }
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.05.2021, 00:51
Цитата Сообщение от Someone007 Посмотреть сообщение
C#
1
2
csEncrypt.Write(data);
 return msEncrypt.ToArray();
К сожалению так работать не будет (прям вот на днях сталкивался). Нужно закрыть поток шифрования, чтобы он обработал конечный блок. Тоже самое у ТСа в коде, когда он пытался со строками работать. Правильный вариант:

C#
1
2
3
4
5
6
7
8
9
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        csEncrypt.Write(data);
                        CryptoStream.Close();
                        return msEncrypt.ToArray();
                    }
                }
Ну либо

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            //Write all data to the stream.  
 
                            swEncrypt.Write(plainText);
                        }
                        csEncrypt.Close();
                        return msEncrypt.ToArray();                
 
                    }
                }
p.s. переходите уже на C#9, это росыпь скобок умиляет...
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
07.05.2021, 01:19
Цитата Сообщение от Wolfdp Посмотреть сообщение
К сожалению так работать не будет (прям вот на днях сталкивался).
Может тогда Flush() вызвать вместо Close()?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.05.2021, 01:30
Цитата Сообщение от Someone007 Посмотреть сообщение
Может тогда Flush() вызвать вместо Close()?
Flush просто выгрузит буфер, нужно именно сказать что это конец записи.
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
07.05.2021, 10:49
Цитата Сообщение от Wolfdp Посмотреть сообщение
К сожалению так работать не будет (прям вот на днях сталкивался). Нужно закрыть поток шифрования, чтобы он обработал конечный блок.
Прекрасно работает без всяких Close().

C#
1
2
3
4
5
6
7
8
9
            long val = 1234567890;
            byte[] data = BitConverter.GetBytes(val);
            byte[] key = Encoding.UTF8.GetBytes("testtesttesttest");
            byte[] iv = Encoding.UTF8.GetBytes("1234123412341234");
 
            byte[] encrypted = Encrypt(data, key, iv);
            byte[] decrypted = Decrypt(encrypted, key, iv);
 
            long val2 = BitConverter.ToInt64(decrypted);
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
        public static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
        {
            using Aes aesAlg = Aes.Create();
            aesAlg.Padding = PaddingMode.None;
            aesAlg.Mode = CipherMode.CFB;
            aesAlg.Key = key;
            aesAlg.IV = iv;
 
            using ICryptoTransform encryptor = aesAlg.CreateEncryptor();
 
            // Create the streams used for encryption.
            using MemoryStream msEncrypt = new MemoryStream();
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                csEncrypt.Write(data);
            return msEncrypt.ToArray();
        }
 
        public static byte[] Decrypt(byte[] data, byte[] key, byte[] iv)
        {
            using Aes aesAlg = Aes.Create();
            aesAlg.Padding = PaddingMode.None;
            aesAlg.Mode = CipherMode.CFB;
            aesAlg.Key = key;
            aesAlg.IV = iv;
 
            using ICryptoTransform decryptor = aesAlg.CreateDecryptor();
 
            // Create the streams used for decryption.
            using MemoryStream msEncrypted = new MemoryStream(data);
            using CryptoStream csEncrypt = new CryptoStream(msEncrypted, decryptor, CryptoStreamMode.Read);
            using MemoryStream msDecrypted = new MemoryStream();
            csEncrypt.CopyTo(msDecrypted);
            return msDecrypted.ToArray();
        }
2
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.05.2021, 17:13
Someone007, внезпно если использовать новый синтаксис using, то действительно работает, т.к. компилятор судя по всему впихивает csEncrypt.Dispose перед return. Но если добавить скобки по старинке -- ожидаемо начнет валится.

C#
1
2
3
4
5
6
7
8
            using (var msEncrypt = new MemoryStream())
            {
                using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    csEncrypt.Write(data);
                    return msEncrypt.ToArray();
                }
            }
А вот так уже работает
C#
1
2
3
4
5
6
7
8
            using (var msEncrypt = new MemoryStream())
            {
                using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    csEncrypt.Write(data);
                }
                return msEncrypt.ToArray();
            }
Собственно в такой вид сокращеный вариант судя по всему и разворачивает.

Добавлено через 1 час 37 минут
Цитата Сообщение от Wolfdp Посмотреть сообщение
Собственно в такой вид сокращеный вариант судя по всему и разворачивает.
Так, это бред, но думаю все остальное поняли -- либо close, либо обернуть чтобы dispose был перед return.
1
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 9
08.05.2021, 18:41  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Прекрасно работает без всяких Close().
Работает отлично. Жаль, что нужна версия 8.0 и выше, а проект 7.3.


Другие варианты бесполезны. Все равно идет исключение.
0
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 9
08.05.2021, 18:42  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Прекрасно работает без всяких Close().
Работает отлично. Жаль, что нужна версия 8.0 и выше, а проект 7.3.


Другие варианты бесполезны. Все равно идет исключение.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
08.05.2021, 18:56
Цитата Сообщение от 0racle Посмотреть сообщение
Работает отлично. Жаль, что нужна версия 8.0 и выше, а проект 7.3.
Не вижу проблем в переписывании using'ов на синтаксис C# 7.3.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.05.2021, 19:58
Цитата Сообщение от 0racle Посмотреть сообщение
Другие варианты бесполезны. Все равно идет исключение.
Цитата Сообщение от 0racle Посмотреть сообщение
aesAlg.Padding = PaddingMode.None;
Вот эту настройку критично использовать? Просто насколько вижу, дает исключение на .net 4.8 и ниже, но вот на 5.0 срабатывает и с такой настройкой.
0
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 9
08.05.2021, 20:37  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Вот эту настройку критично использовать?
Да. В этом вся беда

Добавлено через 8 минут
Цитата Сообщение от Someone007 Посмотреть сообщение
Не вижу проблем в переписывании using'ов на синтаксис C# 7.3.
Сделал. Исключение зависит от версии C#, а не using'ов.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.05.2021, 21:28
Цитата Сообщение от 0racle Посмотреть сообщение
Да. В этом вся беда
Печально. Судя по всему это какой-то баг, т.к. натыкался на такое

Однако, если подумать, режим CFB превращает блочный шифр в потоковый. Потоковые шифры не нуждаются в дополнении. Реализация .NET, по-видимому, нарушена в этом отношении.
Пока наваял такое, но нужно допроверить.
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
    class Program
    {
        static void Main(string[] args)
        {
            var key = new byte[32];
            var iv = new byte[16];
            var manager = new CryptoManager(key, iv);
 
            var val = 1234567890L;
            var data = manager.Encrypt(val);
            //File.WriteAllBytes(@"D:\Temp\1.nya", data);
            var result = manager.DecryptToLong(data);
            if (result != val) throw new Exception();
 
            var str =
@"Black Rock Shooter (яп. ブラック★ロックシューター Буракку Рокку Сю:та:, неоф. рус. «Стрелок с Чёрной Скалы») — OVA режиссёра Синобу Ёсиоки, вышедшая 25 июля 2010 года. Сюжет был основан на одноимённой песне вокалоида Мику Хацунэ[1].
30 сентября 2009 года вышел пилотный DVD аниме. В рамках рекламной кампании аниме выпущены бонусные DVD-диски и распространены вместе с номерами журналов Megami Magazine, Animedia и Hobby Japan. 50-минутная OVA-версия аниме доступна для свободного скачивания с 25 июля по 31 августа 2010 года на официальном сайте[2].
2 февраля 2012 вышло продолжение — аниме-сериал, его трансляция проходит в программном блоке noitaminA телекомпании Fuji TV[3]. ";
            data = manager.Encrypt(str);
            //File.WriteAllBytes(@"D:\Temp\2.nya", data);
            var strResult = manager.DecryptToString(data);
            if (strResult != str) throw new Exception();
            Console.WriteLine("Nya!");
            Console.ReadKey();
        }
    }
 
    public class CryptoManager : IDisposable
    {
        private readonly SymmetricAlgorithm _algorithm;
 
        public CryptoManager(byte[] key, byte[] iv)
        {
            _algorithm = new RijndaelManaged();
            //_algorithm = Aes.Create();
            _algorithm.Mode = CipherMode.CFB;
            _algorithm.Padding = PaddingMode.None;
            _algorithm.Key = key;
            _algorithm.IV = iv;
        }
 
        public void Dispose()
        {
            _algorithm?.Dispose();
        }
 
        public byte[] Encrypt(byte[] data)
        {
            using (var cryptoTransform = _algorithm.CreateEncryptor())
                return TransformData(data, cryptoTransform);
        }
 
        public byte[] Encrypt(long val)
        {
            return Encrypt(BitConverter.GetBytes(val));
        }
 
        public byte[] Encrypt(string val)
        {
            return Encrypt(Encoding.UTF8.GetBytes(val));
        }
 
        public byte[] Decrypt(byte[] data)
        {
            using (var cryptoTransform = _algorithm.CreateDecryptor())
                return TransformData(data, cryptoTransform);
        }
 
        public long DecryptToLong(byte[] data)
        {
            var decryptData = Decrypt(data);
            return BitConverter.ToInt64(decryptData, 0);
        }
 
        public string DecryptToString(byte[] data)
        {
            var decryptData = Decrypt(data);
            return Encoding.UTF8.GetString(decryptData);
        }
 
        private byte[] TransformData(byte[] data, ICryptoTransform cryptoTransform)
        {
            using (var memory = new MemoryStream())
            {
 
                var output = new byte[cryptoTransform.OutputBlockSize];
                var input = new byte[cryptoTransform.InputBlockSize];
 
                var n = data.Length - cryptoTransform.InputBlockSize;
                var i = 0;
                for (; i < n; i += input.Length)
                {
                    Array.Copy(data, i, input, 0, input.Length);
                    var count = cryptoTransform.TransformBlock(input, 0, input.Length, output, 0);
                    memory.Write(output, 0, count);
                }
                for (var x = 0; x < input.Length; x++)
                    input[x] = 0;
                n = data.Length - i;
                Array.Copy(data, i, input, 0, n);
                output = cryptoTransform.TransformFinalBlock(input, 0, input.Length);
                memory.Write(output, 0, n);
 
                return memory.ToArray();
            }
        }
    }
Если коротко -- прохожусь по данным с ручной трансформацией фиксированых блоков, которые ожидает алгоритм, включая финальный, но чтобы не записывать в конец мусор, скипаю лишние байты. На вычитке делаю тоже самое.

Добавлено через 6 минут
Мой ужас выше 100% не рабочий, при попытке вычитать это дело на 5.0 упало.

Добавлено через 17 минут
0racle, у вас есть рабочий вариант шифрования данных на java? Просто я понял что RijndaelManaged в PaddingMode.None не работает и на .net 5.0, только Aes. При этом Aes формирует из моих тестовых данных тоже 8 и 1123 байт соответственно, что очень смахивает на правду... но ставить ide для java и разбиратся не хочется.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
08.05.2021, 21:56
Может жаба там втихаря всё таки использует Padding чтобы блоки нужной длины получались?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.05.2021, 22:11
Someone007, не похоже.

На безрыбье проверил свою реализацию для Aes:
- адекватный код через stream на версии 4.5 тоже не работает с той же ошибкой
- набраное лапками для версии 4.5 сохранил в файлы
- набрал в другом проекте на 5.0 подход через stream и попытался расшифровать. Вроде все работает. Исходя из этого предположу что Rijndael тоже должен работать, но перепроверить будет не лишним.

приклепляю все это безобразие и ухожу дальше деградировать в геншин -- с меня явно на сегодня хватит говнокодинга...

p.s. с большой вероятностью существует более элегантное решение
Вложения
Тип файла: zip ConsoleApp1.zip (6.7 Кб, 5 просмотров)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.05.2021, 22:11
Помогаю со студенческими работами здесь

AES недопустимая длина данных для дешифрования
public static string Encrypt(string plainText, string password, string salt = &quot;Kosher&quot;, string hashAlgorithm = &quot;SHA1&quot;, ...

Недопустимая длина данных для дешифрованния DES
public static string decrypt(string textToDecrypt, string key) { byte BytesToDecrypt =...

Недопустимая длина имени пользователя
mysql&gt; DROP USER `evil-genius@127.0.0.1`; ERROR 1470 (HY000): String 'evil-genius@127.0.0.1' is too long for user name (should be no...

Недопустимая длина массива знаков Base-64
Уже часов пять пытаюсь понять в чем проблема. Когда пытаюсь пройти регистрацию оно выдаёт: System.FormatException: &quot;Недопустимая...

Недопустимая длина массива знаков base-64
Всем доброго! Помогите решить проблему, есть MSSQL 2012 и программка написанная на C# в VS 2010. Одна из функций программы считывать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru