Αυτό που προσπαθώ να κάνω είναι να δημιουργήσω ένα byte το οποίο περιέχει
δικά μου προσαρμοσμένα bits και δημιουργεί μια πληροφορία η οποία με κάποιον
τρόπο ξέρω τη σημαίνει.
Ας πούμε ότι έχω τα εξής bits σε μια συμβολοσειρά:
bits = "01101001"
Πως μπορώ να τα βάλω μέσα σε ένα byte object το οποίο να έχει ακριβώς το μέγεθος ενός byte?
Δηλαδή να φτιάξω το byte:
byte = 01101001
τo οποίο όταν το γράψω στο αρχείο θα είναι ακριβώς ένα byte σε μέγεθος.
Επίσης πως θα κάνω και το ανάποδο? Δηλαδή διαβάζω από το αρχείο το:
byte = 01101001
και μετά το μετατρέπω σε μια συμβολοσειρά:
bits = "01101001"
Πρέπει να μπορώ να το κάνω για να μεταφράσω την πληροφορία.
Ευχαριστώ.
Εμφάνιση 1-8 από 8
-
02-06-17, 21:36 Python: Πως μπορώ να δημιουργήσω ένα byte object από δικά μου bits; #1
-
03-06-17, 11:43 Απάντηση: Python: Πως μπορώ να δημιουργήσω ένα byte object από δικά μου bits; #2
Σε ποια γλώσσα προσπαθείς να το κανεις;
Απ'ότι είδα στο άλλο θέμα χρησιμοποιείς python, οπότε δεν ξέρω εκεί να σε βοηθήσω, αλλα στις περισσότερες γλώσσες που ξέρω μπορείς να το κανεις με bitwise operators! Πχ μπορείς να κάνεις είτε με shift operator << και >> είτε με & και | (and και or) για να θέσεις και να διαβάσεις συγκεκριμένα bit!
- - - Updated - - -
Πχ για να θέσεις το τρίτο bit σε μια μεταβλητή μπορείς να κανεις
Κώδικας:a = a | 4; // 4 = 100 σε δυαδικο
-
03-06-17, 13:04 Απάντηση: Python: Πως μπορώ να δημιουργήσω ένα byte object από δικά μου bits; #3
Υπάρχουν βιβλιοθήκες όπως η bitstring, αλλά γιατί θες να το κάνεις αυτό; Η python δεν είναι φτιαγμένη για να δουλεύεις σε τόσο χαμηλό επίπεδο. Έχεις κάποιο συγκεκριμένο λόγο που χρειάζεσαι bits?
- - - Updated - - -
Δεν είμαι σίγουρος αν υπάρχει τρόπος να δουλέψεις σε κάθε bit έτσι ώστε το καθένα να καταλαμβάνει μόνο ένα bit στη μνήμη, πόσο μαλλον να φτιάχνεις custom bytes και να τα δώσεις στον δίσκο χωρίς να μετατρέψεις το κάθε bit σε one character string.
-
03-06-17, 16:31 Απάντηση: Python: Πως μπορώ να δημιουργήσω ένα byte object από δικά μου bits; #4
Θέλω να φτιάξω αλγόριθμο συμπίεσης για αυτό. Βρήκα τρόπο να το κάνω.
Κώδικας:import struct number = 0 my_bits = [0,0,0,0,0,1,1,1] for i in range( len(my_bits ) ): mask = my_bits [i] mask = mask << i number = number | mask number_of_bytes = struct.pack("i", number) keep_only_the_first_byte = number_of_bytes [0:1]
Κώδικας:my_bits = [0,0,0,0,0,1,1,1] my_number = 0 Για ι = 0, bit = 0 number = 00000000 00000000 00000000 00000000 mask = 00000000 00000000 00000000 00000000 result = 00000000 00000000 00000000 00000000 Για ι = 1, bit = 0 number = 00000000 00000000 00000000 00000000 mask = 00000000 00000000 00000000 00000000 result = 00000000 00000000 00000000 00000000 . . . Για ι = 5, bit = 1 number = 00000000 00000000 00000000 00000000 mask = 00000000 00000000 00000000 00100000 result = 00000000 00000000 00000000 00100000 Για ι = 6, bit = 1 number = 00000000 00000000 00000000 00100000 mask = 00000000 00000000 00000000 01000000 result = 00000000 00000000 00000000 01100000 Για ι = 7, bit = 1 number = 00000000 00000000 00000000 01100000 mask = 00000000 00000000 00000000 10000000 result = 00000000 00000000 00000000 11100000 και τέλος κρατάω το πρώτο μόνο byte το οποίο είναι: 11100000
Ο ολοκληρμένος αλγόριθμος είναι:
Στο πρώτο μέρος βάζω τα bits μέσα σε ένα byte και στο δεύτερο
τα εξάγω από το byte και τα βάζω μέσα σε μια λίστα. Η έξοδος θα είναι
[1,0,1] άρα η πληροφορία μου είναι 101 + 00000 = 10100000
Κώδικας:import struct number = 0 my_bits = [1,0,1,0,0,0,0,0] #--------Put all the bits into a number--------# for i in range( len(my_bits ) ): mask = my_bits [i] mask = mask << i number = number | mask #--------Put all the bits into a number--------# #Pack the integer into 4 bytes. number_of_bytes = struct.pack("i", number) #Keep only the first byte. keep_only_the_first_byte = number_of_bytes [0:1] #Add more 3 bytes. (Make this single byte to an integer number) new_num = keep_only_the_first_byte + struct.pack("i", 0)[0:3] new_bits = [] mask = 1 number = struct.unpack("i", new_num)[0] #-----Get the bits (This is the reverse operation)-----# while number != 0: bit = number & mask new_bits.append( bit ) number = number >> 1 #-----Get the bits (This is the reverse operation)-----# print(new_bits)
-
03-06-17, 18:17 Απάντηση: Python: Πως μπορώ να δημιουργήσω ένα byte object από δικά μου bits; #5
Νομίζω ότι είναι πιο εύκολο να το γράψεις:
Κώδικας:for i in range( len(my_bits ) ): number <<= 1 number |= my_bits [i]
-
03-06-17, 22:10 Απάντηση: Python: Πως μπορώ να δημιουργήσω ένα byte object από δικά μου bits; #6
-
03-06-17, 22:39 Απάντηση: Python: Πως μπορώ να δημιουργήσω ένα byte object από δικά μου bits; #7
Επίσης αντί για
Κώδικας:for idx in range(len(iterable))
Κώδικας:for idx, elem in enumerate(iterable)
Κώδικας:for i in range( len(my_bits ) ): mask = my_bits [i] mask = mask << i number = number | mask
Κώδικας:for idx, mask in enumerate(my_bits): mask = mask << idx number = number | mask
-
05-06-17, 02:59 Απάντηση: Python: Πως μπορώ να δημιουργήσω ένα byte object από δικά μου bits; #8
Τον έφτιαξα τον αλγόριθμο.
Μπορείτε να τον κατεβάσετε και να τον τεστάρετε: https://github.com/babaliaris/Huffman-in-python3
Έχετε υπόψιν σας ότι είναι αρκετά αργός (ο αλγόριθμος) σε αρχεία κειμένου από 1 mb και άνω.
Παρόμοια Θέματα
-
Δεν μπορώ να δημιουργήσω αντίγραφο ασφαλείας HTC 8x Windows phone 8.1
Από pfg στο φόρουμ Άλλες πλατφόρμες και συσκευέςΜηνύματα: 0Τελευταίο Μήνυμα: 15-12-16, 12:20 -
Φακελος windows πιανει 35GB!. Πως μπορω να το μειωσω?
Από nkoumo στο φόρουμ WindowsΜηνύματα: 3Τελευταίο Μήνυμα: 22-10-16, 04:28 -
Πως μπορώ να τυπώσω ασπρόμαυρα;
Από Theodore41 στο φόρουμ Σκληροί δίσκοι, αποθηκευτικά μέσα και λοιπά περιφερειακάΜηνύματα: 2Τελευταίο Μήνυμα: 27-09-16, 12:20 -
Ξέρεις κανείς πως μπορώ να παίρνω backup απο το γραφείο στο σπίτι;
Από stathopon στο φόρουμ Software γενικάΜηνύματα: 8Τελευταίο Μήνυμα: 30-08-16, 00:00 -
Πως μπορω να απαλαχτω απο το μηνυμα για υπαρξη cookies
Από nkoumo στο φόρουμ Internet, web surfing και online υπηρεσίεςΜηνύματα: 3Τελευταίο Μήνυμα: 17-08-16, 15:51
Bookmarks