błędy w próbie xorowania pliku

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

Kopiuj
File "xor.py", line 12, in xor_file
      char = ord(filee.read(1)
TypeError: ord() expected a character, but string of lenght 0 found
Kopiuj
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
IM
Hm, naprawdę tam było lenght czy to przepisywałeś i przepisałeś z błędem?
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


Wizzie
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
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:

Kopiuj
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.

R3
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 20 godzin
  • Postów:419
1

moja propozycja xorowania stringow

Kopiuj
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

Kopiuj
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.

Kopiuj
#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

Kopiuj
char = ord(filee.read(1))

zwraca liczbę(w tym wypadku 255)

Wizzie
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
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?

Wizzie
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
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ę:

Kopiuj
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ść:

Kopiuj
อ๋หา
  • a.jpg (7 KB) - ściągnięć: 134
  • b.xls (0 KB) - ściągnięć: 124

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.