Witam, potrzebuję przepisać ten kod na czysty C. Jednak nie bardzo wiem jak to zrobić. Wydaje mi się, że muszę przepisać klasy na struktury, proszę o wskazówki i pomoc. Program pochodzi ze strony algorytmów i ma za zadanie ukrywać tekst w pliku bmp.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
//!Klasa sluzaca do konwersji liczb i manipulacji na najmlodszym bicie
class Bajt{
public:
int Wartosc;
char Bity[100];
//!Ile bitow ma liczba
int LiczbaBitow;
//!Zamiana atrybutu na wartosci binarne
void Binarnie(void){
int W;
int l=0;
W=Wartosc;
do{
if ((W % 2) == 0)
Bity[LiczbaBitow-l-1]='0';
else
Bity[LiczbaBitow-l-1]='1';
W/=2;
l++;
}while (l!=LiczbaBitow);
}
//!Zamiana wartosci atrybutu na system dziesietny
void Dziesietnie(void){
unsigned long val = 1;
Wartosc=0;
for (int l=0;l<LiczbaBitow;l++)
{
if (Bity[LiczbaBitow-l-1]=='1')
Wartosc+= val;
val *= 2;
}
return;
}
//!Utworzenie 32-bitowej liczby z bajtow a,b,c i d
void Zamien(Bajt a,Bajt b, Bajt c, Bajt d){
a.Binarnie();
b.Binarnie();
c.Binarnie();
d.Binarnie();
for (int i=0;i<8;i++)
Bity[i]=d.Bity[i];
for (int i=0;i<8;i++)
Bity[i+8]=c.Bity[i];
for (int i=0;i<8;i++)
Bity[i+16]=b.Bity[i];
for (int i=0;i<8;i++)
Bity[i+24]=a.Bity[i];
return;
}
//!Ustawia wartosci najmniej znaczacego bitu na i (0 lub 1)
void UstawBit(char i){
Binarnie();
Bity[LiczbaBitow-1]=i;
return;
}
//!Konstruktor (n-liczba bitów na liczbe)
Bajt(int n){
LiczbaBitow=n;
}
};//!Koniec klasy
//!Klasa opisujaca obrazek
class BitMapa{
public:
//!Plik wejsciowy
FILE *Plik;
//!Plik z tekstem do ukrycia
FILE *Tekst;
//!Offset danych
int AdresDanych;
//!Liczba bajtów opisujacych dane
int RozmiarDanych;
//!Szerokosc obrazka w pikselach
int Szerokosc;
//Liczba bajtów tekstu
int RozmiarTekstu;
/*!Metoda wczytujaca adres danych, liczbe bitów kolorów, i szerokosc
*/
int WczytajPlik(char NazwaPliku[50]){
int Znak;
//!Otwórz plik z bitmap¹ (w trybie binarnym)
Plik=fopen(NazwaPliku,"rb");
if (Plik==NULL)
return(0);
//!Przejdz do 10 bajtu i odczytaj adres obszaru danych (4 bajty
fseek(Plik,10,SEEK_SET);
//Utworz 4 jednobajtowe liczby
Bajt *word1=new Bajt(8);
Bajt *word2=new Bajt(8);
Bajt *word3=new Bajt(8);
Bajt *word4=new Bajt(8);
//!Wczytuj 4 kolejne bajty
Znak=getc(Plik);
word1->Wartosc=Znak;
Znak=getc(Plik);
word2->Wartosc=Znak;
Znak=getc(Plik);
word3->Wartosc=Znak;
Znak=getc(Plik);
word4->Wartosc=Znak;
//!Utworz 32-bitowa liczbe z powzszych bajtów
Bajt *Dane=new Bajt(32);
Dane->Zamien(*word1,*word2,*word3,*word4);
Dane->Dziesietnie();
//!Przypisz otrzymana wartosc zmiennej adresu danych
AdresDanych=Dane->Wartosc;
//!Przejdz do 18 bajtu i odczytaj szerokosc
fseek(Plik,18,SEEK_SET);
Znak=getc(Plik);
word1->Wartosc=Znak;
Znak=getc(Plik);
word2->Wartosc=Znak;
Znak=getc(Plik);
word3->Wartosc=Znak;
Znak=getc(Plik);
word4->Wartosc=Znak;
Dane->Zamien(*word1,*word2,*word3,*word4);
Dane->Dziesietnie();
//!Zapamietaj wartosc w atrybucie
Szerokosc=Dane->Wartosc;
//!Przejdz do 34 bajtu i odczytaj dlugosc obszaru danych (4 bajty)
fseek(Plik,34,SEEK_SET);
Znak=getc(Plik);
word1->Wartosc=Znak;
Znak=getc(Plik);
word2->Wartosc=Znak;
Znak=getc(Plik);
word3->Wartosc=Znak;
Znak=getc(Plik);
word4->Wartosc=Znak;
//!Utworz 32-bitowa liczbe
Dane->Zamien(*word1,*word2,*word3,*word4);
Dane->Dziesietnie();
//!Zapamietaj rozmiar danych
RozmiarDanych=Dane->Wartosc;
//!Usun niepotrzebne juz obiekty
delete word1;
delete word2;
delete word3;
delete word4;
delete Dane;
return(1);
} //!Koniec metody
//!Destruktor zamyka otwarte pliki
~BitMapa(void){
fclose(Plik);
fclose(Tekst);
}
//!Metoda odczytuje z bitmapy tekst i drukuje go na ekranie
void Wypisz(char PlikTekstowy[10]){
int k=0;
int Znak;
int Przeczytane=0;
//!Otwórz plik z tekstem (w trybie tekstowym)
Tekst=fopen(PlikTekstowy,"wt+");
/*!Na koncu linii znajduja sie zera nieznaczace. Moze ich byc 0, 1, 2 lub 3
jest to reszta z dzielenia szerokoœci przez 4
*/
int ZeraNieznaczace = Szerokosc % 4;
//!Na koncu tekstu znajduje sie ciag 8 wyzerowanych bitów
int Koniec=0;
Bajt *bajtZnaku=new Bajt(8);
Bajt *bajtTMP=new Bajt(8);
int licznikBitow=0;
fseek(Plik,AdresDanych,SEEK_SET);
while (k!=RozmiarDanych){
Znak=getc(Plik);
Przeczytane++;
if (Przeczytane<=Szerokosc)
{
bajtZnaku->Wartosc=Znak;
bajtZnaku->Binarnie();
bajtTMP->Bity[licznikBitow]=bajtZnaku->Bity[7];
licznikBitow++;
if (licznikBitow==8)
{
licznikBitow=0;
bajtTMP->Dziesietnie();
//!Jezli znalazles bajt 0 (ciag 8 wyzerowanych bitów) to jest to koniec ukrytego tekstu
if (bajtTMP->Wartosc==0) Koniec=1;
if (Koniec==0)
fprintf(Tekst,"%c",bajtTMP->Wartosc);
}
}
if (Przeczytane==Szerokosc+ZeraNieznaczace)
Przeczytane=0;
k++;
}
//!Usun obiekty
delete bajtZnaku;
delete bajtTMP;
return;
}
//!Metoda tworzy bitmape z ukrytym tekstem
int Kopiuj(char NowaBitmapa[10],char PlikTekstowy[10]){
//!Bitmapa z ukrytym tekstem
FILE *DrugiPlik;
int znak;
int Koniec=0;
int k=0;
int Znak;
int Przeczytane=0;
int BitZnaku=0;
int ZnakTekstu;
//!Zera nieznaczace, jak wyzej
int ZeraNieznaczace= Szerokosc % 4;
Bajt *bajt=new Bajt(8);
Bajt *bajtZnaku=new Bajt(8);
//!Otwórz plik z tekstem (w trybie tekstowym)
Tekst=fopen(PlikTekstowy,"rt+");
//!Odczytaj jego rozmiar i wróc na poczatek pliku
RozmiarTekstu=fseek(Tekst,0L,SEEK_END);
RozmiarTekstu = ftell(Tekst);
fseek(Tekst,0L,SEEK_SET);
//!Czy wystarczy pikseli do ukrycia tekstu?
if ((RozmiarTekstu+1)*8>RozmiarDanych)
return(0);
//!Utwórz druga bitmape w trybie binarnym do zapisu
DrugiPlik=fopen(NowaBitmapa,"wb");
//!Wróc na poczatek pierwszej bitmapy
fseek(Plik,0L,SEEK_SET);
/*!Przepisz naglówek oryginalnej bitmapy (az do obszaru danych)
niczego nie zmieniajac
*/
do {
znak=getc(Plik);
if (k<AdresDanych)
putc(znak,DrugiPlik);
k++;
} while (k<AdresDanych);
/*!Przepisuj kolejne bajty obszaru danych zmieniajac ostatni
bit kazdego koloru
*/
k=0;
while (k!=RozmiarDanych){
if ((BitZnaku==0))
{
if (Przeczytane<Szerokosc)
ZnakTekstu=getc(Tekst);
/*!Jezeli skonczyl sie plik z tekstem, wstaw do drugiej bitmapy
8 bajtów z wyzerowanym ostatnim bitem (znacznik konca tekstu)
*/
if (ZnakTekstu==-1)
{
//!Znacznik konca tekstu
bajtZnaku->Wartosc=0;
bajtZnaku->Binarnie();
}
//!Jezeli tekst sie jeszcze nie skonczyl, pobierz nastepny bajt
else{
bajtZnaku->Wartosc=ZnakTekstu;
bajtZnaku->Binarnie();
}
}
//!Pobierz bajt z oryginalnej bitmapy
znak=getc(Plik);
Przeczytane++;
//!Jezeli nie wkroczyles w obszar zer nieznaczzcych i tekst sie jeszcze nie skonczyl
if ((Przeczytane<=Szerokosc)&&Koniec==0)
{
bajt->Wartosc=znak;
bajt->Binarnie();
//!Zmien ostatni bit na kolejnt bit bajtu tekstu
bajt->UstawBit(bajtZnaku->Bity[BitZnaku]);
BitZnaku++;
if (BitZnaku==8)
{
BitZnaku=0;
if (bajtZnaku->Wartosc==0)
Koniec=1;
}
bajt->Dziesietnie();
//!Zapisz zmodyfikowany bajt do nowej bitmapy
znak=bajt->Wartosc;
putc(znak,DrugiPlik);
} else
/*!Jezeli tekst sie juz skonczyl lub wkroczyles w obszar zer nieznaczacych
to przepisz bajt nie zmieniajac go
*/
putc(znak,DrugiPlik);
if (Przeczytane==Szerokosc+ZeraNieznaczace)
Przeczytane=0;
k++;
}
//!Usun obiekty i zamknij zmodyfikowana bitmape
delete bajt;
delete bajtZnaku
fclose(DrugiPlik);
return 1;
}
}; //!Koniec klasy
//-----------------------------------------------
int main(void){
BitMapa BMP;
int opcja;
char BMP1[100];
char BMP2[100];
char TXT[100];
printf("Wybierz opcje\n");
printf("1- Ukrycie pliku\n2- Odzyskanie pliku\n3 - Koniec\n");
do
scanf("%d",&opcja);
while ((opcja!=1)&&(opcja!=2)&&(opcja!=3));
if (opcja==3) return 0;
if (opcja==1){
printf("Nazwa pliku z wejsciowym obrazem: ");
scanf("%s",BMP1);
printf("Nazwa pliku z wejsciowym tekstem: ");
scanf("%s",TXT);
printf("Nazwa pliku z wyjsciowym obrazem: ");
scanf("%s",BMP2);
if (BMP.WczytajPlik(BMP1)==0){
printf("Plik %s nie istnieje\n",BMP1);
getch();
exit(0);
}
if (BMP.Kopiuj(BMP2,TXT)==0)
{
printf("Plik z obrazkiem jest zbyt maly, zeby ukryc tekst\n");
getch();
exit(0);
} else printf("Plik zostal ukryty...\n");
}else
{
printf("Nazwa pliku z wejsciowym obrazem: ");
scanf("%s",BMP1);
printf("Nazwa pliku z wyjsciowym tekstem: ");
scanf("%s",TXT);
if (BMP.WczytajPlik(BMP1)==0){
printf("Plik %s nie istnieje\n",BMP1);
getch();
exit(0);
}
BMP.Wypisz(TXT);
printf("Plik zostal odzyskany...\n");
}
printf("\nDowolny klawisz...\n");
getch();
return 0;
}