Εμφάνιση 1-8 από 8
  1. #1
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Αυτό που προσπαθώ να κάνω είναι να δημιουργήσω ένα byte το οποίο περιέχει
    δικά μου προσαρμοσμένα bits και δημιουργεί μια πληροφορία η οποία με κάποιον
    τρόπο ξέρω τη σημαίνει.



    Ας πούμε ότι έχω τα εξής bits σε μια συμβολοσειρά:
    bits = "01101001"

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

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

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



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

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

    Πρέπει να μπορώ να το κάνω για να μεταφράσω την πληροφορία.

    Ευχαριστώ.

  2. #2
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.451
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Σε ποια γλώσσα προσπαθείς να το κανεις;
    Απ'ότι είδα στο άλλο θέμα χρησιμοποιείς python, οπότε δεν ξέρω εκεί να σε βοηθήσω, αλλα στις περισσότερες γλώσσες που ξέρω μπορείς να το κανεις με bitwise operators! Πχ μπορείς να κάνεις είτε με shift operator << και >> είτε με & και | (and και or) για να θέσεις και να διαβάσεις συγκεκριμένα bit!

    - - - Updated - - -

    Πχ για να θέσεις το τρίτο bit σε μια μεταβλητή μπορείς να κανεις

    Κώδικας:
    a = a | 4; // 4 = 100 σε δυαδικο

  3. #3
    Εγγραφή
    01-04-2007
    Ηλικία
    36
    Μηνύματα
    841
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    11.438 / 1.018
    ISP
    Wind
    DSLAM
    Wind - ΤΟΥΜΠΑ
    Υπάρχουν βιβλιοθήκες όπως η bitstring, αλλά γιατί θες να το κάνεις αυτό; Η python δεν είναι φτιαγμένη για να δουλεύεις σε τόσο χαμηλό επίπεδο. Έχεις κάποιο συγκεκριμένο λόγο που χρειάζεσαι bits?

    - - - Updated - - -

    Δεν είμαι σίγουρος αν υπάρχει τρόπος να δουλέψεις σε κάθε bit έτσι ώστε το καθένα να καταλαμβάνει μόνο ένα bit στη μνήμη, πόσο μαλλον να φτιάχνεις custom bytes και να τα δώσεις στον δίσκο χωρίς να μετατρέψεις το κάθε bit σε one character string.

  4. #4
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Παράθεση Αρχικό μήνυμα από guardianhelm Εμφάνιση μηνυμάτων
    Υπάρχουν βιβλιοθήκες όπως η bitstring, αλλά γιατί θες να το κάνεις αυτό; Η python δεν είναι φτιαγμένη για να δουλεύεις σε τόσο χαμηλό επίπεδο. Έχεις κάποιο συγκεκριμένο λόγο που χρειάζεσαι bits?

    - - - Updated - - -

    Δεν είμαι σίγουρος αν υπάρχει τρόπος να δουλέψεις σε κάθε bit έτσι ώστε το καθένα να καταλαμβάνει μόνο ένα bit στη μνήμη, πόσο μαλλον να φτιάχνεις custom bytes και να τα δώσεις στον δίσκο χωρίς να μετατρέψεις το κάθε bit σε one character string.
    Θέλω να φτιάξω αλγόριθμο συμπίεσης για αυτό. Βρήκα τρόπο να το κάνω.

    Κώδικας:
    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
    - - - Updated - - -

    Ο ολοκληρμένος αλγόριθμος είναι:

    Στο πρώτο μέρος βάζω τα 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)

  5. #5
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.451
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Νομίζω ότι είναι πιο εύκολο να το γράψεις:
    Κώδικας:
    for i in range( len(my_bits ) ):
         number <<= 1
        number |= my_bits [i]
    Αποφεύγεις περιττές μεταβλητές και πράξεις! Όπως κάνεις και στο reverse δηλαδή.

  6. #6
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Παράθεση Αρχικό μήνυμα από MitsakosGR Εμφάνιση μηνυμάτων
    Νομίζω ότι είναι πιο εύκολο να το γράψεις:
    Κώδικας:
    for i in range( len(my_bits ) ):
         number <<= 1
        number |= my_bits [i]
    Αποφεύγεις περιττές μεταβλητές και πράξεις! Όπως κάνεις και στο reverse δηλαδή.
    Ε εντάξει δεν έχει και τόσο σημασία.

  7. #7
    Εγγραφή
    01-04-2007
    Ηλικία
    36
    Μηνύματα
    841
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    11.438 / 1.018
    ISP
    Wind
    DSLAM
    Wind - ΤΟΥΜΠΑ
    Επίσης αντί για

    Κώδικας:
    for idx in range(len(iterable))
    μπορείς να χρησιμοποιείς το

    Κώδικας:
    for idx, elem in enumerate(iterable)
    που είναι πιο καθαρό και σου δίνει ταυτόχρονα και το index και το element. Πχ το:

    Κώδικας:
    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

  8. #8
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Τον έφτιαξα τον αλγόριθμο.

    Μπορείτε να τον κατεβάσετε και να τον τεστάρετε: https://github.com/babaliaris/Huffman-in-python3

    Έχετε υπόψιν σας ότι είναι αρκετά αργός (ο αλγόριθμος) σε αρχεία κειμένου από 1 mb και άνω.

Παρόμοια Θέματα

  1. Δεν μπορώ να δημιουργήσω αντίγραφο ασφαλείας HTC 8x Windows phone 8.1
    Από pfg στο φόρουμ Άλλες πλατφόρμες και συσκευές
    Μηνύματα: 0
    Τελευταίο Μήνυμα: 15-12-16, 12:20
  2. Μηνύματα: 3
    Τελευταίο Μήνυμα: 22-10-16, 04:28
  3. Πως μπορώ να τυπώσω ασπρόμαυρα;
    Από Theodore41 στο φόρουμ Σκληροί δίσκοι, αποθηκευτικά μέσα και λοιπά περιφερειακά
    Μηνύματα: 2
    Τελευταίο Μήνυμα: 27-09-16, 12:20
  4. Μηνύματα: 8
    Τελευταίο Μήνυμα: 30-08-16, 00:00
  5. Πως μπορω να απαλαχτω απο το μηνυμα για υπαρξη cookies
    Από nkoumo στο φόρουμ Internet, web surfing και online υπηρεσίες
    Μηνύματα: 3
    Τελευταίο Μήνυμα: 17-08-16, 15:51

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας