Szteganográfia program objektum orientálttá tétele
2021-11-22T15:34:12+01:00
2021-11-22T20:54:43+01:00
2022-08-12T05:45:30+02:00
Monodevelop
[[BBCODE_828828]]Sziasztok! Az lenne a problémán, hogy van egy olyan feladat, hogy szteganográfia. A cél, hogy egy szót titkosítani kell, egy bekért számú oldalú mátrixban., R,G,B módon. Tehát lenne egy R, egy G, és egy B mátrix. Minden fel kell tölteni egy random generált számmal 0- és 255 között.  A feladat lényege, hogy be kell kérni egy szót, majd abból először kiszedni a nem alfanumerikus karaktereket, majd az ékezetes karaktereket ékezet nélküliekre cserélni, majd a szöveg hosszából gyököt vonni, és az lesz a fent leírt mátrixok oldalszélessége. Ezután végig kell menni egy for ciklussal a szón és ha nagybetű akkor az R, a kisbetű, akkor az R, ha szám, akkor a G értékét kell módosítani az adott karakter ASCII értékével.. Ha a módosítandó karakter a szónak páros indexű eleme, úgy hozzáadjuk, ha páratlan kivonjuk az ASCII kódját. A mátrixok első (0,0) indexű tagját mindenképpen meg kell hagyni bázisértéknek. Ezt követően be kell kérni egy képszélességet, amilyen oldalhosszúságúra ki kell egészíteni a három mátrixot, értelemszerűen a leeső részt báziskarakterekkel kell pótolni. Ezt követően ki kell írni egy fájlba, úgy hogy egy sorba öt érték kerüljön: sorindex, oszlopindex, r adott eleme, g adott eleme, b adott  eleme. Majd visszaolvasom a fájlt, és a három mátrixnál elágazásoknál eldöntöm, hogyha az első tangál kisebb tag van az int tömbben, akkor az első tagból kivonva  a jelenlegit, ha nagyobb akkor a jelenlegiből kivonva az első tagot( és az eredményt karkaterré kasztolva kapott karaktert fűzünk egy stringhez, ha egyik állítás sem igaz, akkor pedig egy csillagot. A három stringet összefuttatjuk a végén és így megkapjuk a dekódolt szöveget(az ékezetes karaktereket nem kell visszaállítani). Elküldöm a jelenlegi kódomat.

using System; using System.IO; using System.Linq; using System.Text; using System.Collections.Generic; using System.Threading.Tasks; namespace Féléves_feladat { class Program { static void Main(string[] args) { Console.WriteLine("Adja meg a bemeneti szöveget!"); string bemenetiszoveg = Console.ReadLine(); string szoveg2 = Lecsupaszit(bemenetiszoveg); string szoveg3 = ÉkezetescsereÉsMéretezés(szoveg2); string szoveg4 = NégyzettéAlakítás(szoveg3); Console.WriteLine("Adja meg a kép szélességét!"); int kepszelesseg = int.Parse(Console.ReadLine()); int[,] Rszoveg = new int[(int)Math.Sqrt(szoveg4.Length), (int)Math.Sqrt(szoveg4.Length)]; int[,] Gszoveg = new int[(int)Math.Sqrt(szoveg4.Length), (int)Math.Sqrt(szoveg4.Length)]; int[,] Bszoveg = new int[(int)Math.Sqrt(szoveg4.Length), (int)Math.Sqrt(szoveg4.Length)]; int rbazis = 0; int gbazis = 0; int bbazis = 0; Kodtomb(szoveg4, ref Rszoveg, ref Gszoveg, ref Bszoveg, ref rbazis, ref gbazis, ref bbazis); TeljesKeppeKiegeszit(kepszelesseg, rbazis, gbazis, bbazis, ref Rszoveg, ref Gszoveg, ref Bszoveg); int[] Rbeolvasott = new int[(int)Math.Pow(kepszelesseg, 2)]; int[] Gbeolvasott = new int[(int)Math.Pow(kepszelesseg, 2)]; int[] Bbeolvasott = new int[(int)Math.Pow(kepszelesseg, 2)]; FájbaÍras(ref Rszoveg, ref Gszoveg, ref Bszoveg); FájlBeolvasás(ref Rbeolvasott, ref Gbeolvasott, ref Bbeolvasott); string kisbetuk = ""; string nagybetuk = ""; string szamok = ""; Visszafejtes(Rbeolvasott, Gbeolvasott, Bbeolvasott, ref kisbetuk, ref nagybetuk, ref szamok); string dekodolt = Összefuttatas(kisbetuk, nagybetuk, szamok); Console.WriteLine("A dekódolt szöveg: " + dekodolt); } static string Lecsupaszit(string szoveg) { string szoveg2 = ""; for (int i = 0; i < szoveg.Length; i++) { if (char.IsLetterOrDigit(szoveg
)) { szoveg2 = szoveg2 + szoveg
; } } return szoveg2; } static string ÉkezetescsereÉsMéretezés(string szoveg) { return szoveg.Replace('Á', 'A').Replace('É', 'E').Replace('Í', 'I').Replace('Ó', 'O').Replace('Ö', 'O').Replace('Ő', 'O').Replace('Ú', 'U').Replace('Ü', 'U').Replace('Ű', 'U').Replace('á', 'a').Replace('é', 'e').Replace('í', 'i').Replace('ó', 'o').Replace('ö', 'o').Replace('ő', 'o').Replace('ú', 'u').Replace('ü', 'u').Replace('ű', 'u'); } static string NégyzettéAlakítás(string szoveg) { string szoveg2 = ""; string szoveg3 = ""; double gyok = Math.Sqrt(szoveg.Length); if (szoveg.Length % gyok == 0) { return szoveg; } else { int hasznosnegyzetoldal = (int)gyok + 1; double ujszoveghossz = Math.Pow(hasznosnegyzetoldal, 2); int kitoltendo = (int)ujszoveghossz - szoveg.Length; for (int i = 0; i < kitoltendo; i++) { szoveg2 = szoveg2 + '*'; } szoveg3 = szoveg + szoveg2; return szoveg3; } } static void Kodtomb(string szoveg, ref int[,] Rszovegben1, ref int[,] Gszovegben1, ref int[,] Bszovegben1, ref int rbazis, ref int gbazis, ref int bbazis) { int[] rszovegben = new int[szoveg.Length]; int[] gszovegben = new int[szoveg.Length]; int[] bszovegben = new int[szoveg.Length]; Random r1 = new Random(); int r = r1.Next(0, 256); int g = r1.Next(0, 256); int b = r1.Next(0, 256); for (int i = 0; i < szoveg.Length; i = i + 1) { rszovegben
= r; } for (int i = 0; i < szoveg.Length; i = i + 1) { gszovegben
= g; } for (int i = 0; i < szoveg.Length; i = i + 1) { bszovegben
= b; } for (int i = 0; i < szoveg.Length - 1; i = i + 1) if (i % 2 == 0) { if (char.IsLower(szoveg
)) { rszovegben[i + 1] = rszovegben[i + 1] + (int)szoveg
; } else if (char.IsUpper(szoveg
)) { gszovegben[i + 1] = gszovegben[i + 1] + (int)szoveg
; } else if (char.IsNumber(szoveg
)) { bszovegben[i + 1] = bszovegben[i + 1] + (int)szoveg
; } } else { if (char.IsLower(szoveg
)) { rszovegben[i + 1] = rszovegben[i + 1] - (int)szoveg
; } else if (char.IsUpper(szoveg
)) { gszovegben[i + 1] = gszovegben[i + 1] - (int)szoveg
; } else if (char.IsNumber(szoveg
)) { bszovegben[i + 1] = bszovegben[i + 1] + (int)szoveg
; } } int indexr = 0; int indexg = 0; int indexb = 0; int[,] keszr = new int[(int)Math.Sqrt(szoveg.Length), (int)Math.Sqrt(szoveg.Length)]; int[,] keszg = new int[(int)Math.Sqrt(szoveg.Length), (int)Math.Sqrt(szoveg.Length)]; int[,] keszb = new int[(int)Math.Sqrt(szoveg.Length), (int)Math.Sqrt(szoveg.Length)]; for (int i = 0; i < keszr.GetLength(0); i = i + 1) { for (int j = 0; j < keszr.GetLength(1); j = j + 1) { keszr[i, j] = rszovegben[indexr]; indexr = indexr + 1; } } for (int i = 0; i < keszg.GetLength(0); i = i + 1) { for (int j = 0; j < keszg.GetLength(1); j = j + 1) { keszg[i, j] = gszovegben[indexg]; indexg = indexg + 1; } } for (int i = 0; i < keszb.GetLength(0); i = i + 1) { for (int j = 0; j < keszb.GetLength(0); j = j + 1) { keszb[i, j] = bszovegben[indexb]; indexb = indexb + 1; } } Rszovegben1 = keszr; Gszovegben1 = keszg; Bszovegben1 = keszb; rbazis = r; gbazis = g; bbazis = b; } static void TeljesKeppeKiegeszit(int kepszelesseg, int rbazis, int gbazis, int bbazis, ref int[,] R, ref int[,] G, ref int[,] B) { int[,] Rkesz = new int[kepszelesseg, kepszelesseg]; int[,] Gkesz = new int[kepszelesseg, kepszelesseg]; int[,] Bkesz = new int[kepszelesseg, kepszelesseg]; int kodkepszel = R.GetLength(0); for (int i = 0; i < kepszelesseg; i = i + 1) { for (int j = 0; j < kepszelesseg; j = j + 1) { Rkesz[i, j] = -1000; } } for (int i = 0; i < kepszelesseg; i = i + 1) { for (int j = 0; j < kepszelesseg; j = j + 1) { Gkesz[i, j] = -1000; } } for (int i = 0; i < kepszelesseg; i = i + 1) { for (int j = 0; j < kepszelesseg; j = j + 1) { Bkesz[i, j] = -1000; } } for (int i = 0; i < kodkepszel; i = i + 1) { for (int j = 0; j < kodkepszel; j = j + 1) { Rkesz[i, j] = R[i, j]; } } for (int i = 0; i < kodkepszel; i = i + 1) { for (int j = 0; j < kodkepszel; j = j + 1) { Gkesz[i, j] = G[i, j]; } } for (int i = 0; i < kodkepszel; i = i + 1) { for (int j = 0; j < kodkepszel; j = j + 1) { Bkesz[i, j] = B[i, j]; } } for (int i = 0; i < kepszelesseg; i = i + 1) { for (int j = 0; j < kepszelesseg; j = j + 1) { if (Rkesz[i, j] == -1000) { Rkesz[i, j] = rbazis; } } } for (int i = 0; i < kepszelesseg; i = i + 1) { for (int j = 0; j < kepszelesseg; j = j + 1) { if (Gkesz[i, j] == -1000) { Gkesz[i, j] = gbazis; } } } for (int i = 0; i < kepszelesseg; i = i + 1) { for (int j = 0; j < kepszelesseg; j = j + 1) { if (Bkesz[i, j] == -1000) { Bkesz[i, j] = bbazis; } } } R = Rkesz; B = Bkesz; G = Gkesz; } static void FájbaÍras(ref int[,] fajl1, ref int[,] fajl2, ref int[,] fajl3) { StreamWriter sw = new StreamWriter("eredmeny.txt", false); for (int i = 0; i < fajl1.GetLength(0); i++) { for (int j = 0; j < fajl1.GetLength(1); j++) { sw.WriteLine(i + "\t" + j + "\t" + fajl1[i, j] + "\t" + fajl2[i, j] + "\t" + fajl3[i, j]); } } sw.Close(); } static void FájlBeolvasás(ref int[] Rbeolvasott, ref int[] Gbeolvasott, ref int[] Bbeolvasott) { int sorokszama = 0; StreamReader sr = new StreamReader("eredmeny.txt"); while (!sr.EndOfStream) { sr.ReadLine(); sorokszama++; } sr.Close(); string[] sorok = new string[sorokszama]; int szamlalo = 0; sr = new StreamReader("eredmeny.txt"); while (!sr.EndOfStream) { sorok[szamlalo] = sr.ReadLine(); szamlalo++; } sr.Close(); int[] r = new int[sorokszama]; int[] g = new int[sorokszama]; int[] b = new int[sorokszama]; for (int i = 0; i < sorok.Length; i++) { string[] sor = sorok
.Split("\t"); r
= int.Parse(sor[2]); g
= int.Parse(sor[3]); b
= int.Parse(sor[4]); } Rbeolvasott = r; Gbeolvasott = g; Bbeolvasott = b; }
Mutasd a teljes hozzászólást!
Tulajdonképpen annyit kellene megtenned, hogy ezt az egész kódoló cuccot berakod egy osztályba.
Az újrafelhasználhatóság miatt.

Készítesz egy osztályt mondjuk Szteganografia néven.
Lesz neki két publikus metódusa encode és decode amiket majd meghívsz.

Valahogy így.

class Szteganografia { public void encode(string fileName, string text, int pictureWidth) { } public string decode(string fileName) { return null; } }
A main függvény meg így néz ki valahogy.

static void Main(string[] args) { Szteganografia szteganografia = new Szteganografia(); Console.WriteLine("Adja meg a bemeneti szöveget!"); string bemenetiszoveg = Console.ReadLine(); Console.WriteLine("Adja meg a kép szélességét!"); int kepszelesseg = int.Parse(Console.ReadLine()); szteganografia.encode("FileName.valami", bemenetiszoveg, kepszelesseg); Console.WriteLine("A dekódolt szöveg: " + szteganografia.decode("FileName.valami")); }
Mutasd a teljes hozzászólást!

  • Ja annyit hogy az értelmezési tartomány 5 és 100 karakter hosszú szövegre terjed ki. Nem kell szűrni a bemeneteket, hanem csak az alábbi két karakterhosszúság között elvárás, hogy releváns eredményt adjon a kimenet.
    Mutasd a teljes hozzászólást!
  • Tulajdonképpen annyit kellene megtenned, hogy ezt az egész kódoló cuccot berakod egy osztályba.
    Az újrafelhasználhatóság miatt.

    Készítesz egy osztályt mondjuk Szteganografia néven.
    Lesz neki két publikus metódusa encode és decode amiket majd meghívsz.

    Valahogy így.

    class Szteganografia { public void encode(string fileName, string text, int pictureWidth) { } public string decode(string fileName) { return null; } }
    A main függvény meg így néz ki valahogy.

    static void Main(string[] args) { Szteganografia szteganografia = new Szteganografia(); Console.WriteLine("Adja meg a bemeneti szöveget!"); string bemenetiszoveg = Console.ReadLine(); Console.WriteLine("Adja meg a kép szélességét!"); int kepszelesseg = int.Parse(Console.ReadLine()); szteganografia.encode("FileName.valami", bemenetiszoveg, kepszelesseg); Console.WriteLine("A dekódolt szöveg: " + szteganografia.decode("FileName.valami")); }
    Mutasd a teljes hozzászólást!
  • Ezt nem én találtam ki, az egyetemi oktatóm mondta, hogy kell egy pixel osztály, a kép osztályban kell magát a kódolást végezni, a program osztály  main metódusában meg kiíratni és bekérni a felhasználótól a szükséges adatokat. De azért köszönöm a választ.
    Mutasd a teljes hozzászólást!
  • Bocsi, nem találtam a hozzászólásodban, hogy mi a tulajdonképpeni kérdésed, kérlek írd be azt is.
    Mutasd a teljes hozzászólást!
  • Ja bakker csak az eleje ment át!Mindjárt küldöm a. Második felét is,a lényeget!
    Mutasd a teljes hozzászólást!
  • A kérdés az, hogy hogyan lehetne objektum orientálttá tenni úgy, hogy  a bázispixeleknek(amivel feltöltjük a mátrixokat) egy külön osztályt kell csinálni, és a kód többi részét pedig egy kép nevezetű osztályba kell elhelyezni. Kivéve a felhasználótól bekérő parancsokat, meg a kiírásokat, ugyanis tudtommal azokat csak a program osztály main metódusában szokás elhelyezni. A kivitelezéssel az a fő gondom, hogy a kép osztályban hiába teszek public-ot a metódusok elejére, nem látszik a main osztályban és fordítási hibát jelez rá. Linkelem az osztályokat, hogy hogyan próbálkoztam. Meg, hogy csak a Program osztályban lehet konstruktorral a pixeleket feltölteni, a kép osztályban nem, pedig ott kéne. Küldöm a próbálkozásaimat is. Mit rontok el? Szintén küldöm a próbálokozásomat(külön, mert túl hosszú!)!
    Mutasd a teljes hozzászólást!
  • A program osztály:

    using System; namespace Féléves_feladat_2 { class Program { static void Main(string[] args) { Console.WriteLine("Adja meg a bemeneti szöveget!"); string bemenetiszoveg = Console.ReadLine(); string szoveg2 = Lecsupaszit(bemenetiszoveg); string szoveg3 = ÉkezetescsereÉsMéretezés(szoveg2); string szoveg4= NégyzettéAlakítás(szoveg3); Console.WriteLine("Adja meg a kép szélességét!"); int kepszelesseg = int.Parse(Console.ReadLine()); } } } }
    Mutasd a teljes hozzászólást!
  • Pixel osztály
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Féléves_feladat_2 { class Pixel { int red; int green; int blue; public Pixel(Random rnd) { red = rnd.Next(0, 256); green = rnd.Next(0, 256); blue = rnd.Next(0, 256); } public int Red { get { return red; } } public int Green { get { return green; } } public int Blue { get { return blue; } } } }
    Mutasd a teljes hozzászólást!
  • Zip-be átküldöm, mert sajnos hozzászólásként túl hosszú lenne a kép osztály, nem menne át hozzászólásként.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Ha hibát jelez, akkor a hibaüzenetet is idézd be, kérlek.
    Mutasd a teljes hozzászólást!
  • Pl. The "name is Lecsupaszit" is not exist in the current context. Az összes hibaüzenet ez. Habár a metódusok elé írtam a public szót, mégis ez a hibaüzenet van. Gondolom nem jól hivatkozok a másik osztályban megírt metódusra, nem elég eléírni a public szót,.
    Mutasd a teljes hozzászólást!
  • Amúgy megnézted már az általam feltöltött zip-ben lévő kódomat?
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd