błędy w próbie xorowania pliku

0

Witam otóż staram się napisać funkcję xor-ującą pliki jednak ciągle napotykam pewien błąd

File "xor.py", line 12, in xor_file
      char = ord(filee.read(1)
TypeError: ord() expected a character, but string of lenght 0 found
def xor_file(fileXOR, fileOUTPUT, key):
	filee = open(fileXOR, "rb")
	cr = open(fileOUTPUT, "wb")
	if(filee != None and cr != None):
		length = len(key)
		char = 0
		xorChar = 0
		mod = 1 
		while(char != None):
			if(mod >= length):
				mod = 1
			char = ord(filee.read(1))
			xorChar = chr(char^ord(key[mod]))
			mod = mod + 1
			if(char != None):
				cr.write(xorChar)
		filee.close()
		cr.close()
	else:
		return False
0

I co jest takiego niezrozumiałego w tym komunikacie? :P

0

To znaczy tylko tyle, że funkcja filee.read(1) nie ma co czytać, więc zwraca pustego stringa. Czyli albo plik jest pusty, albo doszedłeś do końca pliku.

Musisz jakoś sprawdzać, czy nie dostajesz czasami pustego stringa:

c = filee.read(1)
if not c:
    break
char = ord(c)

BTW, zamień wszystkie porównania typu: filee != None na filee is not None, bo jest bardziej "pytoniczne" i nawet chyba szybsze.

1

moja propozycja xorowania stringow

import itertools as it

def xor_string(input, key):
    return ''.join(map(lambda (x, y): chr(ord(x) ^ ord(y)), it.izip(it.cycle(key), input)))

r = xor_string("4programmers", "python")
print map(ord, "4programmers")
print map(ord, "python")
print map(ord, r)

@Wizzie

if filee != None and cr != None

# powiewaz bool(None) == False
# lepiej
if filee and cr:
0

Oryginalny kod był z c++ więc przy przepisywaniu trochę się myliłem.

#include <cstdio>
#include <cstring>
 
using namespace std;
 
bool xorek(const char * plikXorowany, const char *plikWyjsciowy, const char *klucz)
{
    FILE *plik = fopen(plikXorowany, "rb");
    FILE *zaszyfrowany = fopen(plikWyjsciowy, "wb");
 
    if (plik!=NULL && zaszyfrowany!=NULL)
    {
        int length = strlen(klucz);
        int znak, xorChar;
        int mod = 0;
        do
        {
            if (mod >= length)
                mod=0;
            znak = fgetc(plik);
            xorChar = znak^klucz[mod];
            mod++;
            if (znak != EOF)
                fputc(xorChar, zaszyfrowany);
        }
        while (znak != EOF);

        if (fclose(zaszyfrowany)==0 && fclose(plik)==0)
            return true;
        else
            return false;
 
    }
    else
        return false;
} 

@Wizzie

To znaczy tylko tyle, że funkcja filee.read(1) nie ma co czytać, więc zwraca pustego stringa.

Zastanawiałem się nad tym ale sam kod

char = ord(filee.read(1))

zwraca liczbę(w tym wypadku 255)

0

Sam kod, w sensie, że jak uruchomisz go raz? Oczywiście, że masz rację. Jeśli plik ma 200 znaków to pętla będzie ładnie działać 200 razy, a wysypie się za 201. Dzieje się tak dlatego, że po pierwsze: w wersji C++ masz pętlę do while, a w Pythonowej while, a po drugie, ważniejsze: C++'owe fgetc działa trochę inaczej niż twoje ord(filee.read(1)).

0

@Wizzie
nie jestem do końca przekonany czy to 255 to numer znaku czy numer całości. A co do tych różnic w pętli to masz jakieś rozwiązanie?

0

Przecież podałem w moim pierwszym poście :> Nie czaję czym może być "numer całości"? ord zwraca ci numer znaku.

0

Ok. Zrobiłem tak jak radziłeś.
Dodałem jeszcze aby wyświetlało zmienną 'char' i 'c'.
W konsoli wyświetla się:

255
ě
216
 
255
Ó
224

0
None

Wynika z tego, że gdzieś nadal jest błąd.

0

Zapomniałem dodać, że plik wychodzący ma rozmiar 4b i taką oto zawartość:

อ๋หา

1 użytkowników online, w tym zalogowanych: 0, gości: 1