Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits?

Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits? 6 Χρόνια 10 Μήνες πριν #4496

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Ας πούμε ότι έχω τα εξής bits σε μια συμβολοσειρά:
bits = "01101001"

Πως μπορώ να τα βάλω μέσα σε ένα byte object το οποίο να έχει ακριβώς το μέγεθος ενός byte?

Δηλαδή να φτιάξω το byte:
byte = 01101001

τo οποίο όταν το γράψω στο αρχείο θα είναι ακριβώς ένα byte σε μέγεθος.



Επίσης πως θα κάνω και το ανάποδο? Δηλαδή διαβάζω από το αρχείο το:
byte = 01101001

και μετά το μετατρέπω σε μια συμβολοσειρά:
bits = "01101001"

Ευχαριστώ.
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits? 6 Χρόνια 10 Μήνες πριν #4497

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
 
>>> mybytes=bytes([0b00001111,0b11110000])
>>> for i in mybytes:print(bin(i))
 
0b1111
0b11110000
Θα το γράψεις σε binary file και είναι εντάξει
το bytes παράγει ακέραιους
class bytes([source[, encoding[, errors]]])
Return a new “bytes” object, which is an immutable sequence of integers in the range 0 <= x < 256
γιαυτό χρησιμοποιώ το bin για να πάρω τον δυαδικό

To αντίστροφο ίδια φιλοσοφία
>>> myfile=open('myfile', 'rb')
>>> for byte in myfile.read():
	print(byte, bin(byte))
 
 
107 0b1101011
97 0b1100001
108 0b1101100
105 0b1101001
109 0b1101101
101 0b1100101
114 0b1110010
97 0b1100001
32 0b100000
101 0b1100101
108 0b1101100
108 0b1101100
97 0b1100001
100 0b1100100
97 0b1100001
>>> 
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits? 6 Χρόνια 10 Μήνες πριν #4498

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Δηλαδή εάν έχω την λίστα:
l = [0,0,0,0,0,0,0,1]

Πως μπορώ να δημιουργήσω το:
b = bytes( [0b00000001] )

Αλγοριθμικά;
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits? 6 Χρόνια 10 Μήνες πριν #4499

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Εκτιμώ ότι τέτοιοι αλγόριθμοι δεν υπάρχουν
γιατί να χρειαστεί κάποιος να κάνει ένα byte από μία λίστα 8 στοιχείων 0,1
Το πρόβλημα είναι πιστεύω δικό σου και δεν σου ζητήθηκε από κάπου;
και η όποια λύση μπορεί να δημιουργήσει άλλα προβλήματα

Αυτό που θα σκεφτόμουν εγώ για να το κάνω στα γρήγορα είναι να δημιουργήσω σε str το μοντέλο του δυαδικού και να το κάνω evaluation
>>> bits=[0,1,1,0,0,1,1,1]
>>> str_byte='0b'+''.join(str(bit) for bit in bits)
>>> byte=bytes([eval(str_byte)])
>>> byte
b'g'
>>> for i in byte: i
 
103

Εναλλακτικά μπορείς να πάρεις τον ακέραιο που δημιουργούν τα bits και να τον κάνεις byte
αποφεύγεις την eval
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits? 6 Χρόνια 10 Μήνες πριν #4500

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Βρήκα τελικά τρόπο (Χωρίς να έχω συμβολοσειρές).
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]

Χώνω τα bits μέσα σε έναν ακέραιο αριθμό χρησιμοποιώντας μια μάσκα κάθε φορά.

Τελικά θα καταλήξω στον ακέραιο:

(Απ' ότι έχω καταλάβει η python αναπαριστά τα bytes σε big endian, δηλαδή το
λιγότερο σημαντικό byte βρίσκεται τέρμα αριστερά και όχι δεξιά).

00000111 00000000 00000000 00000000

Από τον οποίο με slice θα πάρω το πρώτο byte:
00000111

Τώρα παλεύω να βρω την ανάποδη διαδικασία, η οποία ξέρω πως γίνεται
αρκεί να μετατρέψω ένα μόνο byte σε έναν ακέραιο αριθμό δηλαδή εάν έχω:

00000111

Να προσθέσω σε αυτό άλλα 3 bytes με μηδενικά και να φτιάξω:
00000111 00000000 00000000 00000000
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits? 6 Χρόνια 10 Μήνες πριν #4501

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Μια χαρά το έλυσα! Αν τρέξεις το παρακάτω πρόγραμμα πρέπει να σε λέει [1,0,1] στην έξοδο.
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.
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)

Όπως θα παρατήρησες, η ανάποδη μέθοδος επιστρέφει μόνο τα 3 από τα 8 bits. Πάντα αυτά που περισεύουν είναι μηδενικά άρα ήδη γνωρίζω ότι η πληροφορία είναι:

101 + 00000 = 10100000
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits? 6 Χρόνια 10 Μήνες πριν #4502

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Ακόμα δεν έχω καταλάβει το πρόβλημα.
Ας υποθέσω ότι το κατάλαβα το πρόβλημά έχει ως εξής:

Έχω λίστα στην python με μήκος 8 και στοιχεία 0,1 πχ
bits=[0,1,1,1,0,1,1,0]

και θέλω να την αποθηκεύσω
επειδή όμως αυτή η δομή της λίστας θα μπορούσε να είναι τα bit ενός byte
θα αναπαραστήσω αυτή με ένα byte και θα την αποθηκεύσω σε ένα binary file
έτσι γλιτώνω πολύ αποθηκευτικό χώρο
>>> bits=[0,1,1,1,0,1,1,0]
>>> byte=bytes([int(''.join(str(bit) for bit in bits), 2)])
>>> byte
b'v' #Δεν έχει σημασία η αναπαράσαση σημασία έχει ότι έχει μήκος 1
Θέλω επίσης να μπορώ να παίρνω αυτό το byte και να το ξανακάνω λίστα
>>> bits_new=[int(i) for i in format(byte[0],'08b')]
>>> bits_new
[0, 1, 1, 1, 0, 1, 1, 0]

και με μορφή συναρτήσεων
def kane_ti_lista_byte(bits):
    return bytes([int(''.join(str(bit) for bit in bits), 2)])
 
def kane_to_byte_lista(byte):
    return [int(i) for i in format(byte[0],'08b')]
 



και μπορώ να σκεφτώ ότι αντί για 8*4=32 byte χώρο για κάθε στοιχείο έχω μόνο 1 byte
όμως πιστεύω δεν έιναι έτσι ακριβώς
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πως μπορώ να δημιουργήσω ένα byte από δικά μου bits? 6 Χρόνια 10 Μήνες πριν #4503

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Δεν θέλω να αποθηκεύω την λίστα, θέλω να δημιουργώ bytes τα οποία περιέχουν συγκεκριμένα bits δηλαδή μια δικιά μου πληροφορία (προσαρμοσμένη).

Φτιάχνω έναν αλγόριθμο συμπίεσης κειμένων για αυτό.

Αυτό που φτιάχνω ονομάζεται Huffman Coding. Ψάξε το αν σε ενδιαφέρει.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.568 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου