Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283

Стеганография текста в тексте

16.11.2018, 17:44. Показов 6590. Ответов 43

Студворк — интернет-сервис помощи студентам
Не особо понимаю, как это реализовать. Но в теории это должно работать так, что есть исходный текст с пробелами и в эти пробелы можно занести байты засекреченного слова. И потом из этих пробеловы вытянуть текст. На сколько знаю, там ещё должно хватать пробелов для занесения этого слова. Накидал наброски, кто может подсказать? Как реализовать дальше?
UPD: гуглил стеганографию текста в тексте, ничего нету. Есть только про сокрытие в картинке
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Steganography
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader("text.txt");
            Console.WriteLine("Введите слово:");
            var word = Console.ReadLine();
 
            var fullText = sr.ReadToEnd().ToArray();
        }
 
        static char[] Encryption(char[] text)
        {
            for (int i = 0; i < text.Length; i++)
            {
                if (Char.IsWhiteSpace(text[i]))
                {
                    //спрятать в пробел
                }
            }
            return text;
        }
 
        static string Decryption(char[] text)
        {
            string result = "";
            for (int i = 0; i < text.Length; i++)
            {
                /* if(text[i] == чему-то)
                {
                    result += Encoding.Default.GetString(text[i])
                }*/
            }
            return result;
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2018, 17:44
Ответы с готовыми решениями:

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

поиск и замена текста в очень большом тексте
я искал куски текста и заменял их на другие пока не получил System.OutOfMemoryException, вызванное String.Replace(). и стало понятно, что...

Для каждого символа заданного текста указать подсчитать, сколько раз он встречается в тексте
Для каждого символа заданного текста указать подсчитать, сколько раз он встречается в тексте. В коде ничего менять не надо, лишь вставить...

43
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
16.11.2018, 23:16
Студворк — интернет-сервис помощи студентам
C#
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
while (ind < code.Lenght) // Цикл по символам входной строки
{
    if (code[ind]==' ') // Проверка на пробел
    {
        if (code[ind+1]!=' ') // Проверка на одинарный пробел
        {
             indB++; // Если пробел одиночный - это бит нулевой
         }
         else if (code[ind+2]!=' ') // Проверка на двойной пробел
        {
             wB = (wB | 0b1000_0000); // Запись 1 в старший бит
             indB++; 
         }
         else break; // Выход из цикла, если тройной пробел
         If (indB==8) // Проверка накопленных битов
         {
               wordB.Add(wB); // Если накоплен бай то его запись
                wb = 0;
               indB = 0;
          }             wB = wB >> 1;
     } 
}
На выходе массив байтов из извлечённых битов

Добавлено через 1 минуту
Цитата Сообщение от Bob103 Посмотреть сообщение
оно берётся до тех пор, пока есть текст, который нужно зашифровать?
Да. Берётся первое слово (индекс - 0) и потом оно удаляется. Поэтому индекс следующего слова всегда ноль.

Добавлено через 2 минуты
Теперь осталось конвертировать полученные байты в слово
C#
28
string word = System.Text.Encoding.Default.GetString(wordB);
Добавлено через 3 минуты
Проверьте - может есть мелкие ошибки.
0
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
16.11.2018, 23:26  [ТС]
Элд Хасп, есть ошибка со сдвигом битов в байте у wB, т.к. это итерационная переменная
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
16.11.2018, 23:34
Цитата Сообщение от Bob103 Посмотреть сообщение
есть ошибка со сдвигом битов в байте у wB, т.к. это итерационная переменная
Если сами не разберётесь - посмотрю в VS завтра.
0
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
16.11.2018, 23:39  [ТС]
Элд Хасп, ещё почему-то ругается на
C#
1
wB = (wB | 0b1000_0000)
, что ob1 это Int32. Хотя выше не ругалось хмм

Добавлено через 26 секунд
Элд Хасп, спасибо большое за помощь.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
16.11.2018, 23:57
Цитата Сообщение от Bob103 Посмотреть сообщение
ещё почему-то ругается на
Byte иногда проблемы преобразования типов вызывает. Попробуйте так
C#
1
wB =(byte) (wB | 0b1000_0000)
0
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
17.11.2018, 00:22  [ТС]
Элд Хасп, вот переделал без ошибок, но не работает, мне кажется проблема в дешифровке. Потому что вроде как пробелы двойные ставятся в выходном тексте. В консоли выводит знаки вопроса.
UPD: не уверен в правильности перевода
вот код:
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Steganography
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader("text.txt");
            Console.WriteLine("Введите слово:");
            var word = Console.ReadLine();
            byte[] wordBytes = Encoding.Default.GetBytes(word); // Преобразование слова в массив байтов
            List<string> srWords = sr.ReadToEnd().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            var textWithWord = Encoded(srWords, wordBytes);
            var hiddenWord = Decoded(textWithWord);
            Console.WriteLine(hiddenWord);
        }
 
        static string Encoded(List<string> text, byte[] wordBytes)
        {
            string ret = text[0]; // Выходное значение - записываем первое слово
            text.RemoveAt(0); // Удаляем первое слово
            for(int j = 0; j < wordBytes.Length; j++) // Цикл по байтам
            {
                for (int i = 0; i < 8; i++)    // Цикл по битам
                {
                    if ((wordBytes[j] & 0b1) == 0) // Проверяем младший бит
                        ret += " "; // Если 0 - записываем 1 пробел
                    else
                        ret += "  "; // Если 1 - 2 пробела
                    ret += text[0]; // Добавляем следующее слово
                    text.RemoveAt(0); // Удаляем это слово
                    wordBytes[j] = (byte)(wordBytes[j] >> 1); // Сдвигаем биты байта
                }
            }
            ret += "   "; // записываем 3 пробела, когда байты закончились
            ret += string.Join(" ", text); // Добавляем оставшиеся слова исходного списка
            return ret;
        }
 
        static string Decoded(string codedText)
        {
            List<byte> wordB = new List<byte>(); // Подготовка списка для байтов слова
            byte wB = 0; // Для накопления битов
            int ind = 0; // индекс символов
            int indB = 0; // индекс битов
            while (ind < codedText.Length) // Цикл по символам входной строки
            {
                if (codedText[ind] == ' ') // Проверка на пробел
                {
                    if (codedText[ind + 1] != ' ') // Проверка на одинарный пробел
                    {
                        indB++; // Если пробел одиночный - это бит нулевой
                    }
                    else if (codedText[ind + 2] != ' ') // Проверка на двойной пробел
                    {
                        wB = (byte)(wB | 0b1); // Запись 1 в старший бит
                        indB++;
                    }
                    else break; // Выход из цикла, если тройной пробел
                    if(indB == 8) // Проверка накопленных битов
                    {
                        wordB.Add(wB); // Если накоплен бай то его запись
                        wB = 0;
                        indB = 0;
                    }
                    wB = (byte)(wB >> 1);
                }
                ind++;
            }
            string word = Encoding.UTF8.GetString(wordB.ToArray());
 
            return word;
        }
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
17.11.2018, 00:25
Цитата Сообщение от Bob103 Посмотреть сообщение
вот переделал без ошибок, но не работает, мне кажется проблема в дешифровке. Потому что вроде как пробелы двойные ставятся в выходном тексте. В консоли выводит знаки вопроса.
вот код:
Надо проверить входную и выходную последовательности байт. Если они одинаковые, то проблема в переводу строки в байты и обратно.
0
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
17.11.2018, 00:30  [ТС]
Элд Хасп, разные, сейчас скину
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
17.11.2018, 00:32
Цитата Сообщение от Bob103 Посмотреть сообщение
разные, сейчас скину
НЕ надо - завтра студию запущу и проверю где ошибка
0
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
17.11.2018, 00:32  [ТС]
Элд Хасп, 1- Входная, 2- Выходная. Слово - hell
Миниатюры
Стеганография текста в тексте   Стеганография текста в тексте  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
17.11.2018, 14:00
Лучший ответ Сообщение было отмечено Bob103 как решение

Решение

Цитата Сообщение от Bob103 Посмотреть сообщение
вот код:
Ошибка в 62 строке - неправильно переписали мой код.
Ошибка в 63 строке. Я не учёл, что при двойном пробеле надо указатель дополнительно сдвинуть
C#
62
63
                        wB = (byte)(wB | 0b1000_0000); // Запись 1 в старший бит
                        indB++; ind++;
Вот полный код
Кликните здесь для просмотра всего текста
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
      public  static void Main()
        {
            StreamReader sr = new StreamReader("textOrig.txt");
            Console.WriteLine("Введите слово:");
            var word = "hell" /*Console.ReadLine()*/;
            byte[] wordBytes = Encoding.UTF8.GetBytes(word); // Преобразование слова в массив байтов
            foreach (byte _b in wordBytes)
                Console.WriteLine(Convert.ToString(_b, 2).PadLeft(8,'0'));
            List<string> srWords = sr.ReadToEnd().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            var textWithWord = Encoded(srWords, wordBytes);
 
            Console.WriteLine();
            foreach (byte _b in wordBytes)
                Console.WriteLine(Convert.ToString(_b, 2).PadLeft(8, '0'));
            Console.WriteLine();
 
            var hiddenWord = Decoded(textWithWord);
            Console.WriteLine(hiddenWord);
        }
        static string Encoded(List<string> text, byte[] wordBytes)
        {
            string ret = text[0]; // Выходное значение - записываем первое слово
            text.RemoveAt(0); // Удаляем первое слово
            foreach (byte _wB in wordBytes) // Цикл по байтам
            {
                byte wB = _wB;
                for (int i = 0; i < 8; i++)    // Цикл по битам
                {
                    Console.WriteLine(Convert.ToString(wB, 2).PadLeft(8, '0'));
                    if ((wB & 0b1) == 0) // Проверяем младший бит
                        ret += " "; // Если 0 - записываем 1 пробел
                    else
                        ret += "  "; // Если 1 - 2 пробела
                    ret += text[0]; // Добавляем следующее слово
                    text.RemoveAt(0); // Удаляем это слово
                    wB = (byte)(wB >> 1); // Сдвигаем биты байта
                }
            }
            ret += "   "; // записываем 3 пробела, когда байты закончились
            ret += string.Join(" ", text); // Добавляем оставшиеся слова исходного списка
            return ret;
        }
 
        static string Decoded(string codedText)
        {
            List<byte> wordB = new List<byte>(); // Подготовка списка для байтов слова
            byte wB = 0; // Для накопления битов
            int ind = 0; // индекс символов
            int indB = 0; // индекс битов
            while (ind < codedText.Length) // Цикл по символам входной строки
            {
                if (codedText[ind] == ' ') // Проверка на пробел
                {
                    if (codedText[ind + 1] != ' ') // Проверка на одинарный пробел
                    {
                        indB++; // Если пробел одиночный - это бит нулевой
                    }
                    else if (codedText[ind + 2] != ' ') // Проверка на двойной пробел
                    {
                        wB = (byte)(wB | 0b1000_0000); // Запись 1 в старший бит
                        indB++; ind++;
                    }
                    else break; // Выход из цикла, если тройной пробел
                    Console.WriteLine(Convert.ToString(wB, 2).PadLeft(8,'0'));
                    if (indB == 8) // Проверка накопленных битов
                    {
                        wordB.Add(wB); // Если накоплен байт - его запись
                        wB = 0;
                        indB = 0;
                    }
                    wB = (byte)(wB >> 1);
                }
                ind++;
            }
            string word = Encoding.UTF8.GetString(wordB.ToArray());
 
            return word;
        }


Добавлено через 1 минуту
Если делать по нормальному то надо переделать методы, чтобы принимали Stream. Справитесь?

Добавлено через 41 минуту
Если ничего не напутал - вот поточные методы
Кликните здесь для просмотра всего текста
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
        static MemoryStream Encoded(BinaryReader textStream, string word)
        {
            byte[] wordBytes = Encoding.UTF8.GetBytes(word);
            BinaryWriter ret = new BinaryWriter(new MemoryStream());
 
            WriteWord();
 
            foreach (byte _wB in wordBytes) // Цикл по байтам
            {
                byte wB = _wB;
                for (int i = 0; i < 8; i++)    // Цикл по битам
                {
                    Console.WriteLine(Convert.ToString(wB, 2).PadLeft(8, '0'));
                    if ((wB & 0b1) == 0) // Проверяем младший бит
                        ret.Write(" "); // Если 0 - записываем 1 пробел
                    else
                        ret.Write("  "); // Если 1 - 2 пробела
                                         /* ret += text[0]; // Добавляем следующее слово
                                          text.RemoveAt(0); // Удаляем это слово */
                    SeekNotSpace();
                    WriteWord();
                    wB = (byte)(wB >> 1); // Сдвигаем биты байта
                }
            }
            ret.Write("   "); // записываем 3 пробела, когда байты закончились
                              /*  ret += string.Join(" ", text); // Добавляем оставшиеся слова исходного списка */
            WriteAllWords();
            return (MemoryStream)ret.BaseStream;
 
 
            void SeekSpace() // Сдвигает указатель до первого следующего пробела
            {
                while (textStream.PeekChar() == ' ')
                {
                    if (textStream.PeekChar() < 0) return;
                    textStream.ReadChar();
                }
            }
            void SeekNotSpace() // Сдвигает указатель до первого следующего непробела
            {
                while (textStream.PeekChar() != ' ')
                {
                    if (textStream.PeekChar() < 0) return;
                    textStream.ReadChar();
                }
            }
 
            void WriteWord() // Записывает в выходной поток слово - от текущей позиции до первого пробела
            {
                while (textStream.PeekChar() != ' ')
                {
                    if (textStream.PeekChar() < 0) return;
                    ret.Write(textStream.ReadChar());
                }
            }
            void WriteAllWords() // Записывает в выходной поток весь остаток входного
            {
                while (textStream.PeekChar() >= 0)
                {
                    ret.Write(textStream.ReadChar());
                }
            }
        }
 
        static string Decoded(BinaryReader codedText)
        {
            List<byte> wordB = new List<byte>(); // Подготовка списка для байтов слова
            byte wB = 0; // Для накопления битов
                         // int ind = 0; // индекс символов
            int indB = 0; // индекс битов
            while (codedText.PeekChar() >= 0) // Цикл по символам входного потока
            {
                int numSp = CountNextSpace();
                switch (CountNextSpace())
                {
                    case 1:
                        indB++; // Если пробел одиночный - это бит нулевой
                        break;
                    case 2:
                        wB = (byte)(wB | 0b1000_0000); // Запись 1 в старший бит
                        indB++;
                        break;
                }
                Console.WriteLine(Convert.ToString(wB, 2).PadLeft(8, '0'));
                if (indB == 8) // Проверка накопленных битов
                {
                    wordB.Add(wB); // Если накоплен байт - его запись
                    wB = 0;
                    indB = 0;
                }
                wB = (byte)(wB >> 1);
 
                if (numSp == 3) break;
            }
            string word = Encoding.UTF8.GetString(wordB.ToArray());
 
            return word;
 
            int CountNextSpace() // Определяет сколько пробелов в следующем промежутке
            {                    // и сдвигает указатель до начала следующего слова
                int ret = 0;
                SeekSpace();
                while (codedText.PeekChar() >= 0)
                {
                    if (codedText.PeekChar() == ' ')
                        ret++;
                    if (ret == 3)
                    {
                        SeekNotSpace();
                        break;
                    }
                }
                return ret;
            }
 
            void SeekNotSpace() // Сдвигает указатель до первого следующего непробела
            {
                while (codedText.PeekChar() != ' ')
                {
                    if (codedText.PeekChar() < 0) return;
                    codedText.ReadChar();
                }
            }
 
            void SeekSpace() // Сдвигает указатель до первого следующего пробела
            {
                while (codedText.PeekChar() == ' ')
                {
                    if (codedText.PeekChar() < 0) return;
                    codedText.ReadChar();
                }
            }
 
        }
1
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
19.11.2018, 09:38  [ТС]
Элд Хасп, добрый день, такой реализации хватит, спасибо. У меня возникли вопросы:
1) В расшифровке при проверке пробелов
C#
1
2
3
4
5
6
7
8
9
10
11
if (codedText[ind] == ' ') // Проверка на пробел
                {
                    if (codedText[ind + 1] != ' ') // Проверка на одинарный пробел
                    {
                        indB++; // Если пробел одиночный - это бит нулевой
                    }
                    else if (codedText[ind + 2] != ' ') // Проверка на двойной пробел
                    {
                        wB = (byte)(wB | 0b1000_0000); // Запись 1 в старший бит
                        indB++; ind++;
                    }
Разве это не будет уже 3 пробелом
C#
1
else if (codedText[ind + 2] != ' ') // Проверка на двойной пробел
2) Вопрос про старший бит и младший они же одинаковые. Разве нет? И вообще в принципе про сдвиги не очень понятно)
C#
1
 if ((wB & 0b1) == 0) // Проверяем младший бит
C#
1
wB = (byte)(wB | 0b1000_0000); // Запись 1 в старший бит
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
19.11.2018, 12:07
Цитата Сообщение от Bob103 Посмотреть сообщение
Разве это не будет уже 3 пробелом
C#
1
else if (codedText[ind + 2] != ' ')// Проверка на двойной пробел
Мы проверяем "неравно" - это условие выполняется если пробел двойной. Для тройного (и более) пробела должно быть условие "равно".
0
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
19.11.2018, 12:08  [ТС]
Элд Хасп, ааа да, почему-то думал, что там просто равно. Понял
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
19.11.2018, 12:16
Цитата Сообщение от Bob103 Посмотреть сообщение
2) Вопрос про старший бит и младший они же одинаковые. Разве нет? И вообще в принципе про сдвиги не очень понятно)
Не понял, что Вам не понятно.
Как могут быть старший и младший бит одинаковыми?
Что конкретно Вам непонятно со сдвигами?

Добавлено через 6 минут
Цитата Сообщение от Bob103 Посмотреть сообщение
ааа да, почему-то думал, что там просто равно. Понял
Мы таким образом "по ступенькам" проверяем длину пробела.
Одинарный пробел - первый - пробел, второй - нет.
Двойной пробел - первый пробел, следующий - пробел, третий - нет.
Тройной пробел - первый пробел, следующий - пробел, третий - пробел.

Так как проверка "ступеньками" конструкцией if...else if...., то на следующей ступеньке проверять условие предыдущей нет необходимости. И получаем
Найти пробел - первый - пробел,
Одинарный пробел - второй - не пробел.
Двойной пробел - иначе, третий - нет.
Тройной пробел - иначе третий - пробел.
0
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
19.11.2018, 12:29  [ТС]
Элд Хасп, про биты, это я ошибся. Всё верно. Вопрос со сдвигами: мы сдвигаем биты, чтобы перейти к следующему верно?
UPD: при этом затирается последний?

Добавлено через 6 минут
Элд Хасп, и ещё вопрос с добавлением слова
C#
1
2
3
4
5
if ((wB & 1) == 0) // Проверяем младший бит
                        ret += " "; // Если 0 - записываем 1 пробел
                    else
                        ret += "  "; // Если 1 - 2 пробела
                    ret += text[0]; // Добавляем следующее слово
Не понял, как мы добавляем слово, исходя из кода, каждый раз в проходе? Просто он вроде бы не в теле условия лежит, поэтому чёт запутался.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
19.11.2018, 12:33
Цитата Сообщение от Bob103 Посмотреть сообщение
Вопрос со сдвигами: мы сдвигаем биты, чтобы перейти к следующему верно?
UPD: при этом затирается последний?
Да.
При записи мы записываем начиная с младшего. Поэтому проверяем состояние младшего и в цикле сдвигаем на его место по очереди все остальные биты. При сдвиге старший устанавливается в 0.
При записи мы тоже записываем начиная с младшего, но так как в конце запись всех битов мы сдвигаем на 8 битов, чтобы младший оказался на своём месте надо записать его сначала в старший бит и потом в циклах он сдвинется на своё место.

Добавлено через 3 минуты
Цитата Сообщение от Bob103 Посмотреть сообщение
Не понял, как мы добавляем слово, исходя из кода, каждый раз в проходе? Просто он вроде бы не в теле условия лежит, поэтому чёт запутался.
В условиях мы записываем только пробел разной длины в зависимости от проверяемого бита.
После записи пробела, надо записать следующее слово из источника. Так как оно всегда записывается после пробела ЛЮБОЙ длины, то смысла включать его запись в условие - нет.
0
 Аватар для Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 283
19.11.2018, 12:41  [ТС]
Элд Хасп, вроде разобрался спасибо большое ещё раз)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
19.11.2018, 13:09
Цитата Сообщение от Bob103 Посмотреть сообщение
вроде разобрался спасибо большое ещё раз)
Поточные методы смотрели?
0
0 / 0 / 1
Регистрация: 16.06.2016
Сообщений: 13
19.11.2018, 15:23
Сори за оффтоп. Но почему Вы выбрали стеганогафию, а не криптографию?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2018, 15:23
Помогаю со студенческими работами здесь

Выделяет каждое слово текста, оканчивающееся на гласную букву; определяет количество таких слов в тексте
Здравствуйте! Имеется вот такое задание: &quot;Выделяет каждое слово текста, оканчивающееся на гласную букву; определяет количество таких слов в...

Стеганография. Индекс находился вне границ массива
Здравствуйте участники форума, помогите разобраться с кодом. Такая проблема такая, открываю картинку bmp, выбираю текстовый файл,...

Стеганография в jpg: как влияет степень сжатия на качество результата
Есть программа которая вшивает текст в картинку формата BMP, после чего можно также извлечь вшитый текст, но нужно сделать это для формата...

Стеганография в тексте
Вообщем дело такое: имеется текст известного произведения, в котором нужно произвести мульки со строками, чтобы получить одно слово... Вот...

Стеганография.Шифрование текста в картинку
Задали курсовую Стеганография, нужно чтобы текст шифровался в картинку jpeg. Помогите пожалуйста. Не знаю с чего даже начать,как делать....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru