Διαδρομές
/
Elixir
Elixir
/
Ασκήσεις
/
Ανιχνευτής αρχείων
Ανιχνευτής αρχείων

Ανιχνευτής αρχείων

Άσκηση εκμάθησης

Εισαγωγή

Δυαδικά δεδομένα

Η Elixir παρέχει μια κομψή σύνταξη για την εργασία με δυαδικά δεδομένα, όπως έχουμε δει με την ειδική μορφή <<>> που παρέχεται για την εργασία με συμβολοσειρές bit.

Ο δυαδικός τύπος είναι μια εξειδίκευση του τύπου συμβολοσειράς bit. Ενώ οι συμβολοσειρές bit μπορούν να έχουν οποιοδήποτε μήκος (οποιονδήποτε αριθμό bit), τα δυαδικά δεδομένα είναι εκείνα όπου ο αριθμός των bit διαιρείται ακριβώς με το 8. Δηλαδή, όταν δουλεύουμε με δυαδικά δεδομένα, συχνά σκεφτόμαστε με όρους byte (8 bit). Ένα byte μπορεί να αναπαραστήσει ακέραιους αριθμούς από το 0 έως το 255. Είναι συνηθισμένο να δουλεύουμε με τιμές byte σε δεκαεξαδική μορφή, 0x00 - 0xFF.

Τα δυαδικά δεδομένα ορίζονται χρησιμοποιώντας την ειδική μορφή συμβολοσειράς bit <<>>. Όταν ορίζουμε ένα δυαδικό δεδομένο, μπορούμε να χρησιμοποιήσουμε ακέραιους αριθμούς και συμβολοσειρές. Ακέραιες τιμές μεγαλύτερες από το 255 θα υπερχειλίσουν και θα χρησιμοποιηθούν μόνο τα τελευταία 8 bit του ακέραιου. Από προεπιλογή, ο τροποποιητής ::binary εφαρμόζεται στην τιμή. Μπορούμε να συνενώσουμε δυαδικά δεδομένα με τον τελεστή <>/2.

<<255>> == <<0xFF>>
# Overflowing bits are truncated
<<256>> == <<0>>
<<2, 4, 6, 8, 10, 12, 14, 16>> == <<0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x10>>

Ένα null byte είναι μια άλλη ονομασία για το <<0>>.

Αντιστοίχιση προτύπων σε δυαδικά δεδομένα

Η αντιστοίχιση προτύπων επεκτείνεται μάλιστα και στα δυαδικά δεδομένα, και μπορούμε να κάνουμε αντιστοίχιση προτύπων σε ένα τμήμα των δυαδικών δεδομένων, όπως ακριβώς θα κάναμε και για μια λίστα.

# Ignore the first 8 bytes, match and bind the remaining to `body`
<<_::binary-size(8), body::binary>>

Όπως και με άλλα είδη αντιστοίχισης προτύπων, μπορούμε να το χρησιμοποιήσουμε σε υπογραφές συναρτήσεων για να κάνουμε αντιστοίχιση κατά την επιλογή από πολλαπλές ρήτρες συναρτήσεων.

Οδηγίες

Δουλεύεις σε ένα έργο που επιτρέπει στους χρήστες να ανεβάζουν αρχεία στον διακομιστή για να τα μοιράζονται με άλλους χρήστες. Σου έχει ανατεθεί να γράψεις μια συνάρτηση που επαληθεύει ότι ένα ανεβασμένο αρχείο ταιριάζει με τον τύπο μέσου του. Κάνεις λίγη έρευνα και ανακαλύπτεις ότι τα πρώτα λίγα bytes ενός αρχείου είναι συνήθως μοναδικά για αυτόν τον τύπο αρχείου, κάτι που του δίνει ένα είδος υπογραφής.

Χρησιμοποίησε τον παρακάτω πίνακα ως αναφορά:

Τύπος αρχείου Συνήθης επέκταση Τύπος μέσου δυαδική 'υπογραφή'
ELF "exe" "application/octet-stream" 0x7F, 0x45, 0x4C, 0x46
BMP "bmp" "image/bmp" 0x42, 0x4D
PNG "png" "image/png" 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A
JPG "jpg" "image/jpg" 0xFF, 0xD8, 0xFF
GIF "gif" "image/gif" 0x47, 0x49, 0x46

1. Δεδομένης μιας επέκτασης, επέστρεψε τον αναμενόμενο τύπο μέσου

Υλοποίησε τη συνάρτηση type_from_extension/1. Πρέπει να δέχεται μια επέκταση αρχείου (συμβολοσειρά) και να επιστρέφει τον τύπο μέσου (συμβολοσειρά) ή nil αν η επέκταση δεν ταιριάζει με τις αναμενόμενες.

FileSniffer.type_from_extension("exe")
# => "application/octet-stream"

FileSniffer.type_from_extension("txt")
# => nil

2. Δεδομένου ενός δυαδικού αρχείου, επέστρεψε τον αναμενόμενο τύπο μέσου

Υλοποίησε τη συνάρτηση type_from_binary/1. Πρέπει να δέχεται ένα αρχείο (δυαδικό) και να επιστρέφει τον τύπο μέσου (συμβολοσειρά) ή nil αν η υπογραφή του αρχείου δεν ταιριάζει με τις αναμενόμενες.

file = File.read!("application.exe")
FileSniffer.type_from_binary(file)
# => "application/octet-stream"

file = File.read!("example.txt")
FileSniffer.type_from_binary(file)
# => nil

Μην ανησυχείς για την ανάγνωση του αρχείου ως δυαδικού. Υπέθεσε ότι έχει γίνει για σένα και ότι παρέχεται από τα tests ως όρισμα.

3. Δεδομένης μιας επέκτασης και ενός δυαδικού αρχείου, επαλήθευσε ότι το αρχείο ταιριάζει με τον αναμενόμενο τύπο

Υλοποίησε τη συνάρτηση verify/2. Πρέπει να δέχεται ένα αρχείο (δυαδικό) και μια επέκταση (συμβολοσειρά) και να επιστρέφει μια πλειάδα :ok ή :error.

file = File.read!("application.exe")

FileSniffer.verify(file, "exe")
# => {:ok, "application/octet-stream"}

FileSniffer.verify(file, "png")
# => {:error, "Warning, file format and file extension do not match."}
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Elixir Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ανιχνευτής αρχείων;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.