Перевод из двоичного кода в текст - C#
Формулировка задачи:
Добрый день, в c# совсем новичок, занимаюсь стеганографией. Почти все сделал только немного не понимаю как раскодировать. Сначала я заливаю картинку, затем пишу сообщение. Это сообщение перевожу в двоичный код. Посредством измены последнего пикселя я меняю последний бит пиксиля на тот, который у меня в сообщении. Делаю с [0,0] пикселя и до последнего, посредством i++ и j++ в циклах. В дешифровке забираю свое сообщение в двоичном коде, которое в string'е. и что делать дальше не знаю. К примеру, string s = "10101010101010101101001010101010", прошу помочь, буду очень благодарен.
Решение задачи: «Перевод из двоичного кода в текст»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace New_Steg
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button3_Click(object sender, EventArgs e)
{
OpenFileDialog openDialog = new OpenFileDialog();
openDialog.Filter = "Image Files (*.png, *.jpg) | *.png; *.jpg";
openDialog.InitialDirectory = @"C:\\Users\Desktop";
if (openDialog.ShowDialog() == DialogResult.OK)
{
textBoxFilePath.Text = openDialog.FileName.ToString();
pictureBox1.ImageLocation = textBoxFilePath.Text;
}
}
private void button1_Click(object sender, EventArgs e) // кнопка кодирования
{
Bitmap img = new Bitmap(textBoxFilePath.Text);
int m = 0; //счетчик
string mess = "";
for (int i=0;i<textBoxMessage.TextLength;i++)
{
char letter = Convert.ToChar(textBoxMessage.Text.Substring(i, 1));
byte b_letter = Convert.ToByte(letter);
mess += Convert.ToString(b_letter, 2);
} //конвертация текста в двоичный код
Console.WriteLine("all letters " + mess);
for (int i = 0; i < img.Width; i++)
{
for (int j = 0; j < img.Height; j++)
{
Color pixel = img.GetPixel(i, j);
byte b_pixel = Convert.ToByte(pixel.B); // получение кода синего пикселя
if (m <mess.Length)
{
img.SetPixel(i, j, Color.FromArgb(pixel.R, pixel.G, code(b_pixel,mess.Substring(m,1))));
Console.WriteLine("i " + i + " j " + j+ " bytes: "+ b_pixel+" mess_1 "+mess.Substring(m, 1));
m++;
} // изменяет голубой бит пикселя
if (i == img.Width - 1 && j == img.Height - 1)
{
img.SetPixel(i, j, Color.FromArgb(pixel.R, pixel.G, mess.Length));// записывает кол-во битов текста в последний пиксель
break;
}
}
}
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Filter = "Image Files (*.png, *.jpg) | *.png; *.jpg";
saveFile.InitialDirectory = @"C:\\Users\Desktop";
if (saveFile.ShowDialog() == DialogResult.OK)
{
textBoxFilePath.Text = saveFile.FileName.ToString();
pictureBox1.ImageLocation = textBoxFilePath.Text;
img.Save(textBoxFilePath.Text);
}// сохранение
}
private void button2_Click(object sender, EventArgs e) //кнопка декодирования
{
Bitmap img = new Bitmap(textBoxFilePath.Text);
string b_message = ""; //битовое сообщение
string message = ""; //сообщение, которое должно получиться
int m = 0; //счетчик
Color lastpixel = img.GetPixel(img.Width - 1, img.Height - 1);
int msgLength = lastpixel.B; // конец сообщения из битов
for (int i = 0; i < img.Width; i++)
{
for (int j = 0; j < img.Height; j++)
{
Color pixel = img.GetPixel(i, j);
if (m < msgLength)
{
int value = pixel.B;
Console.WriteLine("Pixel.b = " + pixel.B + " bit= " + decode(value));
b_message += decode(value);
m++;
}// переписывает в b_message биты первых пикселей
}
}
string a = "";
message += Convert.ToString(b_message);
Console.WriteLine(a);
textBoxMessage.Text = a;
}
private void Form1_Load(object sender, EventArgs e)
{
BackColor = Color.BlueViolet;
textBoxFilePath.BackColor = Color.Aqua;
}
static int code(int number,string bit) // кодирование пикселя
{
if ((number % 2 == 0 && bit == "1") || (number % 2 != 0 && bit == "0"))
{
if (number != 0)
{
number--;
return number;
}
else number++;
return number;
}
else return number;
}
static int decode(int number) // получение бита из пикселя
{
if (number % 2 == 0)
return 0;
else return 1;
}
}
}