Šifriranje preglednice

Pomoč pri delu s programom Calc
Odgovori
Ace
Prispevkov: 2
Pridružen: Če Dec 20, 2007 3:56 pm
Kraj: Maribor

Šifriranje preglednice

Odgovor Napisal/-a Ace »

Pozdravljeni!

Imam en problem pri šifriranju preglednice, šifrira mi vredi, ko pa hočem dešifrirat pa mi javi napako v: A = Asc(znak).
Preizkušam funkcijo SifrirajCelico
Napaka pri klicanju funkcije SifrirajCelico: Neveljaven klic procedure.
Moram pa napisat makro, ki bo šifriral/dešifriral aktivno območje celic preglednice. Za šifriranje oz. dešifriranje moram vnest geslo iz katerega bom najprej izračunal zrno za generator naključnih števil. Celice moram šifrirat z operacijo XOR. Šifrirat je treba vrednosti celic in enačbe (pazit moramo da bodo ustvarjeni samo znaki ASCII med 32 in 127).

Moram pa imeti 2 funkciji (SifrirajCelico, GesloVZrno) in 2 podprograma (SifrirajList in Main).


Koda: Izberi vse

Function  SifrirajCelico(Celica$, Zrno, Znacka$)	' Znacka$ = "ZNACKA", Celica$ = vrednost/formula, Zrno = Zrno

Dim kodirano, znak As String
Dim i, dolzinaZnacke, dolzinaCelice As Integer

kodirano = ""

Randomize(Zrno)

dolzinaZnacke = Len(Znacka$)
dolzinaCelice = Len(Celica$)

If (Left(Celica$,1) = "=") Or (Left(Celica$,1) = "+") Or (Left(Celica$,1) = "-") Then
	Celica$ = Znacka$ + Celica$	' Na začetek niza Celica$ vstavimo niz Znacka$
	kodirano = Znacka$	' Na začetek vstavimo značko
	
	For i = dolzinaZnacke + 1 To dolzinaCelice	' Za vsak znak celice od zadnjega znaka v nizu Znacka$
		znak = Mid(Celica$,i,1)	' Vzamemo trenutni znak
		A = Asc(znak)	' Znak pretvorimo v ascii kodo in shranimo v A
		If (A > 31) And (A < 128) Then
				B = CInt(rnd()*31)
				A = A XOR B
				rezultat = Chr(A)
				kodirano = kodirano + rezultat	
		Else
			kodirano = kodirano + znak	' Če je posebni znak (šumniki,..) ga ne de/kodiramo
		End If
	Next i
	
Else If (Left(Celica$,dolzinaZnacke)) = Znacka$ Then	' V primeru da se na začetku niza Celica$ nahaja značka; Funkcija Left vrne levi del niza Celica$ z dolžino Značka$
	Celica$ = Right(Celica$,(dolzinaCelice - dolzinaZnacke))	' Niz, ki predstavlja značko se vzame iz Celica$; Funkcija Right vrne desni del niza Celica$ velikosti dolžina celice minus dolžina značke  
	For i = 1 To dolzinaCelice	' Za vsak znak v celici
		znak = Mid(Celica$,i,1) ' Vzamemo trenutni znak
		A = Asc(znak)	' Znak pretvorimo v ascii kodo in shranimo v A
		If (A > 31) And (A < 128) Then
				B = CInt(rnd()*31)
				A = A XOR B
				rezultat = Chr(A)
				kodirano = kodirano + rezultat	
		Else
			kodirano = kodirano + znak	' Če je posebni znak (šumniki,..) ga ne de/kodiramo
		End If
	Next i

Else
	For i = 1 To dolzinaCelice	' Za vsak znak v celici
		znak = Mid(Celica$,i,1)	' Vzamemo trenutni znak
		A = Asc(znak)	' Znak pretvorimo v ascii kodo in shranimo v A
		If (A > 31) And (A < 128) Then
				B = CInt(rnd()*31)
				A = A XOR B
				rezultat = Chr(A)
				kodirano = kodirano + rezultat	
		Else
			kodirano = kodirano + znak	' Če je posebni znak (šumniki,..) ga ne de/kodiramo
		End If
	Next i
  End If
End If
SifrirajCelico = kodirano
		
End Function
[/quote]

Hvala, Jani
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Da se ne spuščam predaleč :)...
  1. Ne razumem kakšen pomen naj bi imela značka... A pustiva to.
  2. Če že to značko tlačite v niz potem mora for zanka teči pač od prvega znaka celice, ki se sedaj nahaja na mestu (dolžinaZnačke + 1;kar je OK), toda konec besede se je temu ustrezno tudi prestavil ta dolžinoZnačke ==> dolžinaCelice+dolžinaZnačke!
  3. Kakšno vrednost pa ima znak, preden želite iz njega dobiti ASCII vrednost - po moje je to unicode znak in le ta nima definirane ascii vrednosti!
  4. .... več ko razčistiva točko 3
Torej glede na to, da vam funkcija ne deluje pravilno, se morate kot programer najprej vprašati kakšno vrednost ima vhod, takrat ko funkcij ne deluje. Torej kakšno vrednost ima spremenljivka znak?
lp,
Matjaž Prtenjak
Administrator
Ace
Prispevkov: 2
Pridružen: Če Dec 20, 2007 3:56 pm
Kraj: Maribor

Odgovor Napisal/-a Ace »

Celica$ vsebuje formulo/vrednost celice. V parametru Zrno je podano začetno zrno za inicializacijo generatorja naključnih števil, medtem ko spremenljivka Znacka$ vsebuje niz uporabljen za označevanje enačb. Funkcija se mora nahajati v modulu MojModul. Funkcija ne sme spremeniti vsebine spremenljivke Celica$ in kot rezultat vrne (de)šifrirano vsebino celice.
Znacka$ je nek niz (pri nas je ta niz "ZNACKA"), ki ga vstavimo pred enačbo. Torej če je vrednost v celici A1 =A2/2, je potem ZNACKA=A2/2. To pa zato, da Calc ne prepozna kot enačbo ampak kot string.

Edit: Ok sem že naredil. V tretjem if stavku sem moral dati še en if stavek za preverjanje =,+ ali - in če je, je vstavlo značko pred niz.
Odgovori