Thread View: pl.comp.lang.python
7 messages
7 total messages
Started by Morfi
Thu, 28 Jan 2010 19:45
podział wczytanego pliku na bloki zadanej wielkości
Author: Morfi
Date: Thu, 28 Jan 2010 19:45
Date: Thu, 28 Jan 2010 19:45
38 lines
2852 bytes
2852 bytes
Hello, spotkałem się z tym problemem pierwszy raz. Mając np. str z zawartością: '01000101001101011000010111110001000101001101011000010111110001000101001101011000010111110001000101001101011000010111110011111111' Teraz potrzebuję go podzielić na mniejsze ciągi np. po 8, a następnie przesunąć całość ciągu o 10 bitów w prawo, do takiej postaci: '11010110000101111100010001010011010110000101111100010001010011010110000101111100010001010011010110000101111100111111110100010100' i tak około 50 razy. O ile dla pierwszej krotki w for nie mam problemu: listowany = list(naszstr)[a:a+16] ok = ''.join(listowany) tak nie wiem, jak przesunąć pierwotny str tak, aby uzyskać zamierzony efekt. I to jest pierwszy problem. drugi problem: Zastanawiam się również, jak zapisać każdy wynik. Sądzę, iż array() będzie dobrym wyborem, jednak przed zapisaniem prawdopodobnie będę potrzebował str przekonwertować na coś, co pozwoli mi wykonywanie działań (suma, mnożenie) na bitach (powyższe ciągi to wczytane bity). Jednak przy konwersji na int (de facto long), ucina mi przednie zera... Kolejna sprawa, po przekonwertowaniu takiego ciągu na int() jest on zwykłą liczbą(dec), nie jest binarny, a to oznacza, iż należy dokonać konwersji bin(), jednak w tym miejscu nie mogę wykorzystać standardowej funkcji bin()... czy ktoś spotkał się z takim problemem, ewentualnie może mnie naprowadzić na rozwiązanie takiej sytuacji?
Re: podział wczytanego pliku na bloki zadanej wielkości
Author: Łukasz Rekucki
Date: Thu, 28 Jan 2010 21:11
Date: Thu, 28 Jan 2010 21:11
52 lines
3571 bytes
3571 bytes
On Jan 28, 8:45 pm, Morfi <jarek.dam...@gmail.com> wrote:
> Hello,
>
> spotkałem się z tym problemem pierwszy raz. Mając np. str z
> zawartością:
>
> '01000101001101011000010111110001000101001101011000010111110001000101001101 011000010111110001000101001101011000010111110011111111'
>
> Teraz potrzebuję go podzielić na mniejsze ciągi np. po 8, a następnie
> przesunąć całość ciągu o 10 bitów w prawo, do takiej postaci:
>
> '11010110000101111100010001010011010110000101111100010001010011010110000101 111100010001010011010110000101111100111111110100010100'
>
> i tak około 50 razy.
>
> O ile dla pierwszej krotki w for nie mam problemu:
>
> listowany = list(naszstr)[a:a+16]
> ok = ''.join(listowany)
>
> tak nie wiem, jak przesunąć pierwotny str tak, aby uzyskać zamierzony
> efekt. I to jest pierwszy problem.
>
> drugi problem:
> Zastanawiam się również, jak zapisać każdy wynik. Sądzę, iż array()
> będzie dobrym wyborem, jednak przed zapisaniem prawdopodobnie będę
> potrzebował str przekonwertować na coś, co pozwoli mi wykonywanie
> działań (suma, mnożenie) na bitach (powyższe ciągi to wczytane bity).
> Jednak przy konwersji na int (de facto long), ucina mi przednie
> zera...
>
> Kolejna sprawa, po przekonwertowaniu takiego ciągu na int() jest on
> zwykłą liczbą(dec), nie jest binarny, a to oznacza, iż należy dokonać
> konwersji bin(), jednak w tym miejscu nie mogę wykorzystać
> standardowej funkcji bin()...
>
> czy ktoś spotkał się z takim problemem, ewentualnie może mnie
> naprowadzić na rozwiązanie takiej sytuacji?
Reprezentowanie w ten sposób liczb to jakaś masakra. Przecież każdy
bit w tym momencie zajmuję cały bajt. Ale jeśli ktoś już cie w to
wrobił, to łatwo
zamienić to na sensowną liczbę przy użyciu int(). Trzeba tylko
wiedzieć, że drugi argument określa podstawę zapisu:
>>> int('101', 2)
5
Python obsługuję liczby całkowite dowolnego rozmiaru, więc takie
długie ciągi nie są problemem. Dalej wykonujesz zwykłe operację na
bitach. bin() służy do wypisywania liczby w postaci zer i jedynek -
nie odwrotnie.
Re: podział wczytanego pliku na bloki zadanej wielkości
Author: Morfi
Date: Thu, 28 Jan 2010 22:12
Date: Thu, 28 Jan 2010 22:12
104 lines
4895 bytes
4895 bytes
On 28 Sty, 22:11, Łukasz Rekucki <lreku...@gmail.com> wrote:
> On Jan 28, 8:45 pm, Morfi <jarek.dam...@gmail.com> wrote:
>
>
>
> > Hello,
>
> > spotkałem się z tym problemem pierwszy raz. Mając np. str z
> > zawartością:
>
> > '01000101001101011000010111110001000101001101011000010111110001000101001101 011000010111110001000101001101011000010111110011111111'
>
> > Teraz potrzebuję go podzielić na mniejsze ciągi np. po 8, a następnie
> > przesunąć całość ciągu o 10 bitów w prawo, do takiej postaci:
>
> > '11010110000101111100010001010011010110000101111100010001010011010110000101 111100010001010011010110000101111100111111110100010100'
>
> > i tak około 50 razy.
>
> > O ile dla pierwszej krotki w for nie mam problemu:
>
> > listowany = list(naszstr)[a:a+16]
> > ok = ''.join(listowany)
>
> > tak nie wiem, jak przesunąć pierwotny str tak, aby uzyskać zamierzony
> > efekt. I to jest pierwszy problem.
>
> > drugi problem:
> > Zastanawiam się również, jak zapisać każdy wynik. Sądzę, iż array()
> > będzie dobrym wyborem, jednak przed zapisaniem prawdopodobnie będę
> > potrzebował str przekonwertować na coś, co pozwoli mi wykonywanie
> > działań (suma, mnożenie) na bitach (powyższe ciągi to wczytane bity).
> > Jednak przy konwersji na int (de facto long), ucina mi przednie
> > zera...
>
> > Kolejna sprawa, po przekonwertowaniu takiego ciągu na int() jest on
> > zwykłą liczbą(dec), nie jest binarny, a to oznacza, iż należy dokonać
> > konwersji bin(), jednak w tym miejscu nie mogę wykorzystać
> > standardowej funkcji bin()...
>
> > czy ktoś spotkał się z takim problemem, ewentualnie może mnie
> > naprowadzić na rozwiązanie takiej sytuacji?
>
> Reprezentowanie w ten sposób liczb to jakaś masakra. Przecież każdy
> bit w tym momencie zajmuję cały bajt. Ale jeśli ktoś już cie w to
> wrobił, to łatwo
> zamienić to na sensowną liczbę przy użyciu int(). Trzeba tylko
> wiedzieć, że drugi argument określa podstawę zapisu:
>
> >>> int('101', 2)
>
> 5
>
> Python obsługuję liczby całkowite dowolnego rozmiaru, więc takie
> długie ciągi nie są problemem. Dalej wykonujesz zwykłe operację na
> bitach. bin() służy do wypisywania liczby w postaci zer i jedynek -
> nie odwrotnie.
Zastanawiam się teraz nad poprawnością mojego myślenia.
Chodzi o to, iż mam załadować dwa różne pliki bit po bicie, podzielić
je na bloki i wykonywać operacje artymetyczne...
Właśnie jednak sobie uświadomiłem, iż :
<plik>
jakistekst
</plik>
a =open(plik, 'rb')
b =a.read()
print b
zwraca nam literał czyli:
>> jakistekst
zamiast ciągu bitów w stylu 0b001010.... lub chociaż str w stylu:
'001010...'
Teraz zastanawiam się, jak z tego wybrnąć. Czyżbym musiał czytać to po
znaku i korzystać z binascii. Jednak binascii nie ogarniam... ponieważ
zgodnie z dokumentacją mogę sobie wybrać, jak binascii ma konwertować
dane:
http://docs.python.org/library/binascii.html
Jednak, cały czas to nie jest to, do czego dążę, ponieważ nie
otrzymuję formy dla mnie użytecznej:
np.
>>binascii.a2b_uu("z")
'\x00\x00\x00...'
a ja potrzebuję 0b00010....
Wniosek dla mnie na razie taki, że za dużo django, za mało konsoli i
dłubania... i nie wiem już jak z tego wybrnąć...
Re: podział wczytanego pliku na bloki zadanej wielkości
Author: Karol 'Cubix' Piłat
Date: Thu, 28 Jan 2010 22:15
Date: Thu, 28 Jan 2010 22:15
16 lines
1721 bytes
1721 bytes
On 28.01.2010 22:11, Łukasz Rekucki wrote:
> Python obsługuję liczby całkowite dowolnego rozmiaru, więc takie
> długie ciągi nie są problemem. Dalej wykonujesz zwykłe operację na
> bitach. bin() służy do wypisywania liczby w postaci zer i jedynek -
> nie odwrotnie.
Zobacz co wypluwa bin(~int("101", 2")), a później pisz o zwykłych
operacjach bitowych.
http://wiki.python.org/moin/BitwiseOperators
Proponuję użyć modułu bitarray, jest całkiem fajny do takich rzeczy.
Implementowałem na nim BitTorrenta.
http://pypi.python.org/pypi/bitarray/
Pozdrawiam,
Karol 'Cubix' Piłat
Re: podział wczytanego pliku na bloki zadanej wielkości
Author: Łukasz Rekucki
Date: Thu, 28 Jan 2010 23:27
Date: Thu, 28 Jan 2010 23:27
31 lines
2682 bytes
2682 bytes
On Jan 28, 11:15 pm, Karol 'Cubix' Piłat <cu...@wytnijmnie-cubix.pl>
wrote:
> On 28.01.2010 22:11, Łukasz Rekucki wrote:
>
> > Python obsługuję liczby całkowite dowolnego rozmiaru, więc takie
> > długie ciągi nie są problemem. Dalej wykonujesz zwykłe operację na
> > bitach. bin() służy do wypisywania liczby w postaci zer i jedynek -
> > nie odwrotnie.
>
> Zobacz co wypluwa bin(~int("101", 2")), a później pisz o zwykłych
> operacjach bitowych.http://wiki.python.org/moin/BitwiseOperators
Jest to wyraźnie napisane w dokumentacji języka:
http://docs.python.org/3.1/reference/expressions.html#unary-arithmetic-and-bitwise-operations
The unary ~ (invert) operator yields the bitwise inversion of its
integer argument. The bitwise inversion of x is defined as -(x+1). It
only applies to integral numbers.
Wszystkie te operację zachowują się normalnie: ~x | x = -1, ~x & x =
0, ~x ^ x = -1. Jakbyś chciał inaczej zdefiniować negację w systemie z
nieskończoną ilością bitów ?
>
> Proponuję użyć modułu bitarray, jest całkiem fajny do takich rzeczy.
> Implementowałem na nim BitTorrenta.http://pypi.python.org/pypi/bitarray/
Też bym użył czegoś w tym stylu.
---
Łukasz Rekucki
Re: podział wczytanego pliku na bloki zadanej wielkości
Author: Morfi
Date: Fri, 29 Jan 2010 15:29
Date: Fri, 29 Jan 2010 15:29
44 lines
3452 bytes
3452 bytes
On 29 Sty, 00:27, Łukasz Rekucki <lreku...@gmail.com> wrote:
> On Jan 28, 11:15 pm, Karol 'Cubix' Piłat <cu...@wytnijmnie-cubix.pl>
> wrote:> On 28.01.2010 22:11, Łukasz Rekucki wrote:
>
> > > Python obsługuję liczby całkowite dowolnego rozmiaru, więc takie
> > > długie ciągi nie są problemem. Dalej wykonujesz zwykłe operację na
> > > bitach. bin() służy do wypisywania liczby w postaci zer i jedynek -
> > > nie odwrotnie.
>
> > Zobacz co wypluwa bin(~int("101", 2")), a później pisz o zwykłych
> > operacjach bitowych.http://wiki.python.org/moin/BitwiseOperators
>
> Jest to wyraźnie napisane w dokumentacji języka:
>
> http://docs.python.org/3.1/reference/expressions.html#unary-arithmeti...
>
> The unary ~ (invert) operator yields the bitwise inversion of its
> integer argument. The bitwise inversion of x is defined as -(x+1). It
> only applies to integral numbers.
>
> Wszystkie te operację zachowują się normalnie: ~x | x = -1, ~x & x =
> 0, ~x ^ x = -1. Jakbyś chciał inaczej zdefiniować negację w systemie z
> nieskończoną ilością bitów ?
>
>
>
> > Proponuję użyć modułu bitarray, jest całkiem fajny do takich rzeczy.
> > Implementowałem na nim BitTorrenta.http://pypi.python.org/pypi/bitarray/
>
> Też bym użył czegoś w tym stylu.
>
> ---
> Łukasz Rekucki
Z przyjemnością bym skorzystał z bitarray, jednak chyba będę musiał
sobie poradzić bez tego narzędzia... a to wszystko przez błędy podczas
instalacji. Niestety pracuję na wirtualnych maszynach i czas mnie
goni. Nie mam czasu na reinstalację całych systemów, które są
przystosowane tylko i wyłącznie pod ten projekt... Nawet setuptools
nie pomaga w instalacji, a ja już nie mam energii do dalszej walki z
tym tematem.
Jeśli ktoś ma inne pomysły, rozwiązania powyższego problemu, będę
wdzięczny za rady.
Re: podział wczytanego pliku na bloki zadanej wielkości
Author: Karol 'Cubix' Piłat
Date: Sat, 30 Jan 2010 10:12
Date: Sat, 30 Jan 2010 10:12
14 lines
1933 bytes
1933 bytes
On 29.01.2010 16:29, Morfi wrote: > Z przyjemnością bym skorzystał z bitarray, jednak chyba będę musiał > sobie poradzić bez tego narzędzia... a to wszystko przez błędy podczas > instalacji. Niestety pracuję na wirtualnych maszynach i czas mnie > goni. Nie mam czasu na reinstalację całych systemów, które są > przystosowane tylko i wyłącznie pod ten projekt... Nawet setuptools > nie pomaga w instalacji, a ja już nie mam energii do dalszej walki z > tym tematem. > > Jeśli ktoś ma inne pomysły, rozwiązania powyższego problemu, będę > wdzięczny za rady. http://code.google.com/p/python-bitstring/ Czysty python. Kilka razy wolniejszy od bitarray :P
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads