trad Δημοσ. 11 Ιουλίου 2003 Δημοσ. 11 Ιουλίου 2003 Καλησπέρα! Έστω ότι γνωρίζουμε τη δομή ενός αρχείου. Πιο συγκεκριμένα, ας πούμε τα 4 πρώτα byte αναγράφουν τον αριθμό (int) 9994 σε big-Endian. Μετά έχουμε σε little-endian τον integer 0001 (4 bytes), μετά 2 double (8 bytes) σε big-endian ....κοκ. Έτσι, λοιπόν, με δύο λόγια, ξέρουμε byte προς byte τη δομή που πρέπει να έχει ένα αρχείο που θέλουμε να δημιουργήσουμε ή να κάνουμε edit (και τα δύο ευπρόσδεκτα). 3 ερωτήσεις: 1) Άνοιξα το αρχείο με HEX editor (Ultra edit 32) και είχα πρόβλημα στο να ανγνώσω τους double αριθμούς. Έψαξα στο internet και βρήκα (διορθώστε με αν κάνω λάθος) ότι οι hex έχουν πρόβλημα με τους double. Υπάρχει τρόπος (είτε πρόγραμμα είτε με προγραμματισμό) να ανοίξω και να διαβάσω τα περιεχόμενα του αρχείου? 2) Υπάρχει τρόπος να δημιουργηθεί πρόγραμμα (σε οποιαδήποτε γλώσσα) που να κάνει edit σε επίπεδο byte αρχεία? 3) Υπάρχει τρόπος να φτιάξω εγώ απο το μηδέν ένα αρχείο byte προς byte? (Με οποιαδήποτε γλώσσα προγρ.) Ευχαριστώ προκαταβολικά για την όποια απάντηση
Lyman_Zerga Δημοσ. 11 Ιουλίου 2003 Δημοσ. 11 Ιουλίου 2003 Για να δουλέψει σωστά ο Ηex Editor θα πρέπει να μπορεί να αναγνωρίσει το format που είναι ένα αρχείο. Δεν έχει τύχει να δώ ποτέ αρχείο με μπερδεμένο little και big endian! Αν ο Hex Editor διαβάζει τα δεδομένα και τα ερμηνεύει όλα ως big endian, τότε είναι λογικό να βγαίνι λάθος η τελική αναπαράσταση. Αφού γνωρίζεις την δομή του αρχείου, μπορείς να γράψεις ένα custom πρόγραμμα ώστε να το διαβάσεις σωστά.
trad Δημοσ. 14 Ιουλίου 2003 Μέλος Δημοσ. 14 Ιουλίου 2003 Ξέχνα τον HEX. Ακόμα-ακόμα ξέχνα και την ανάγνωση του αρχείου. Υπάρχουν εντολές (σε C++, JAVA, VB, C) μέσω των οποίων να φτιάξω τελικά ένα αρχείο byte by byte? Αυτό είναι το ζητούμενο. Και μια και είπες για HEX, δεν έχει σημασία (για τον HEX) σε τι endian θα είναι το αρχείο. Πχ αν έχουμε τον αριθμό 1 τότε σε big endian θα γράφει: 0 0 0 1, ενώ αν είναι σε little θα είναι 1 0 0 0. Εμείς πρέπει να ξέρουμε απο που προς τα που να το διαβάσουμε και πόσα byte φτιάχνουν το αριθμό. Όσο για τους double, εκεί όντος υπάρχει πρόβλημα. Thx anyway, περιμένω απάντηση
Turrican Δημοσ. 15 Ιουλίου 2003 Δημοσ. 15 Ιουλίου 2003 Υπάρχουν εντολές (σε C++, JAVA, VB, C) μέσω των οποίων να φτιάξω τελικά ένα αρχείο byte by byte? Αυτό είναι το ζητούμενο. Χωρίς να είμαι ειδικός, τουλάχιστον στη Java υπάρχει το I/O package που σου επιτρέπει να κάνεις αυτό που θέλεις και με το παραπάνω. Πιο συγγεκριμένα υπάρχουν οι κλάσεις FileInputStream / FileOutputStream που διαβάζουν / γράφουν αντίστοιχα bytes από αρχεία. Δημήτρης
HdkiLLeR Δημοσ. 15 Ιουλίου 2003 Δημοσ. 15 Ιουλίου 2003 Ean exw katalavei kala auto pou thes na kaneis einai na diavaseis times apo ena binary arxeio( i adistoixa na dimiourgiseis ena binary file).Ean gnorizeis tin bomi toy arxeioy px opos les prwta iparxoun 2 int kai meta 2 double orizeis mia struct poy tha perigrafei tin domi tis kathe egrafis toy arxeioy kai stin sinexeia diavazeis i grafeis peristaseis autis tis domis sto arxeio binary. Code se C++: > //Orismos tis domis poy perigrafei to arxeio struct record { int int1,int2; double d1,d2; }; //Dimiourgia enos adikeimenou rois eisodou ifstream RecFileIn; int main() { record Temprec; //Sisxetismos tis rois eisodou me to binary arxeio RecFileIn.open("input.dat",ios_base::in | ios_base::binary); RecFileIn.read((char*) &TempRec,sizeof(TempRec)); //... return 0; } Sto endiameso simeio me tis ... vazeis tis edoles sou gia na kaneis oti thes me tis times tws metablitwn tis domis TempRec(TempRec.int1,TempRec.int2...).Twra ean den theleis na diavazeis olokliri tin domi alla enan enan toys akereous kai toys pragmatikous boreis na kaneis to exeis: > //Dimiourgia enos adikeimenou rois eisodou ifstream RecFileIn; int main() { int int1,int2; double dbl1,dbl2; //Sisxetismos tis rois eisodou me to binary arxeio RecFileIn.open("input.dat",ios_base::in | ios_base::binary); //Anagnosi toy prwtou akereou RecFileIn.read((char*) &int1,sizeof(int)); //Metafora toy dikti eisodou kata sizeof(int) bytes RecFileIn.seekg((streampos)sizeof(int)); //Anagnosi toy 2ou akeraiou(anagnosi sizeof(int) bytes apo tin trexousa thesi RecFileIn.read((char*) &int2,sizeof(int)); //Metafora toy dikti eisodou kata sizeof(int) bytes RecFileIn.seekg((streampos)sizeof(int)); //Anagnosi toy 1ou double(anagnosi sizeof(double) bytes apo tin trexousa thesi RecFileIn.read((char*) &dbl1,sizeof(double)); //... return 0; } Etsi boreis na sinexiseis me tin anagnwsi kai tin eggrafi(i eggrafi ginete me tin methodo write() kai i metafora toy dikti exodou me tin methodo seekp()) oso to arxeio den exei teleiwsei. Adistoixes edoles prospelasis iparxoun se oles tis glwsses.Elpizw na se voithisa ligaki..Ean thes pereterw plirofories sxetika me to read/write edw eimaste.
Γηρυόνης Δημοσ. 15 Ιουλίου 2003 Δημοσ. 15 Ιουλίου 2003 > 3) Υπάρχει τρόπος να φτιάξω εγώ απο το μηδέν ένα αρχείο byte προς byte? Πολύ απλά όταν θα ανοίξεις το αρχείο τα δεδομένα που θα βάλεις μέσα θα είναι τύπου byte. Αν μας πεις σε ποια γλώσσα το θέλεις ίσως να σου δώσουμε συκγεκριμένες πληροφορίες. Απλώς να θυμάσαι ότι οι τύποι δεδομένων μπορεί να είναι διαφορετικοί, αναλόγως με τη γλώσσα. Για παράδειγμα ο τύπος char στη Java είναι δύο byte ενώ σε κάποιες παλιότερες γλώσσες είναι ένα byte.
Turrican Δημοσ. 15 Ιουλίου 2003 Δημοσ. 15 Ιουλίου 2003 Μιας και το θέμα με ενδιαφέρει ιδιαίτερα πολύ και εμένα, είπα να ρωτήσω τις απορίες μου εδώ για οποιον περισσότερο ειδικό από εμένα να μου τις λύσει Υπόψιν έχω πάρει εδώ και κάτι μήνες ένα βιβλίο που λέγεται "Ivor Horton's Biginning Java 2" και προσπαθώ - με αρκετό ενδιαφέρον - να μάθω Java. Δυστηχώς τα κεφάλαια που αφορούν τα streams δεν με έχουν καλύψει οσο θα ήθελα -- Αρχικά με τα streams λοιπόν, τι είναι και πως δουλεύουν. 1. Έχω καταλήξει οτι stream είναι ένα κομάτι κώδικα της γλώσσας προγραμματισμού, που κατέχει τους μηχανισμούς ώστε να μπορεί να διαβάζει / γράφει από μια πηγή κατά σειριακό τρόπο. 2. Ολα τα streams υπακούουν στον κανόνα 1 data / φορά. Ακόμη και αν παρέχουν τη δυνατότητα να επιστρέψουν περισσότερα data / φορά (με εναλλακτικές μεθόδους), εσωτερικά δουλεύουν έτσι. 3. Πηγή μπορεί να είναι οτιδήποτε μπορεί να συνδεθεί με τον Η/Υ. -- Ειδικότερα με το Java I/O. 1. Γιατί η βασική μέθοδος ολων των stream κλάσεων - read() / write() - επιστρέφει (int) αντί για (byte); 2. Έψαχνα μέρες για να βρώ μέθοδο - function - που μετατρέπει (int) σε (char) ή (byte) σε (char) αντίστοιχα για να ανακαλύψω οτι πολύ απλά αυτό γίνετε με casting! Πράγμα που μου δημιουργεί τις εξής 3 απορίες: 2α. Είναι σωστό αυτό; 2β. Τελικά ο τύπος (char) είναι μια άλλη "καμουφλαρισμένη" μορφή του τύπου (short); 2γ. Μπορώ και πρέπει να συμπεριφέρομαι στον τύπο (char) σαν να ήταν αριθμός; 3. Χρησιμοποιώντας για παράδειγμα τη μέθοδο read(byte[] buf) ενός stream, δεν γίνεται ουσιαστικά buffering ίσο οσο χωράει και η array που περνάμε ως argument; Αν ναί, ποια η διαφορά με το να "ενσωματώσεις" το stream object μέσα σε ένα stream buffer (wrapper?); -- Γενικότερα με τη Java (δεν είναι απαραίτητο να τα σχολιάσετε). Μου "τη δίνει" η ιδέα να χρησιμοποιώ wrappers. Ιδιαίτερα οταν πρέπει να κάνω ένα object wrap σε ένα wrapper, και αμέσως μετά το wrapper wrap σε ένα άλλο wrapper και πάει λέγοντας... Από ένα σημείο και μετά χάνω το μπούσουλα! Οπως και με το παραπάνω, απο ένα σημείο και μετά μου "τη δίνει" η πολλαπλή χρήση της "κληρονομικότητας" που όλοι θαυμάζουν στον OO τρόπο προγραμματισμού. Οπως διάβασα και σε ένα άρθρο τα "παιδιά" που έχουν προκύψει από 3 και μετά επίπεδα, έχουν μεταλάχθεί αρκετά ωστε να κάνουν τα πράγματα χειρότερα και πολύπλοκα αντί για καλύτερα και απλούστερα. Δημήτρης ΥΓ. Συγνώμη για το μεγάλο μέγεθος του μηνύματός μου και αν οι ερωτήσεις είναι "χαζές"
javanidhs Δημοσ. 16 Ιουλίου 2003 Δημοσ. 16 Ιουλίου 2003 Java i/O H java eχει τα stream απο την C οι μηχανισμοι καιη λογικη ειναι ιδια..δεν τα εφιαξαν τωρα..απλα με την Java τα εκανα πιο απλα! Αν καποιος δεν εχει εμπειρια με streams απο προηγουμενη γλωσσα τοτε ειναι λογικο να του φανουν παραξενα..και στην Java η και C#. πολλοι εχουν παραπονεθει για την πολυπλοκοτητα του πακετου (και εγω το ειχα κανει καποτε σαν complete newbe..παρολα αυτα μετα απο λιγο χρονο.. αλλαξα γνωμη.και καταλαβα ποσο ευκολα ειναι .πιστεψε η αγανακτηση ειναι παροδική! Αρχιζεις παντα απο εδώ! το ευαγγελιο! http://java.sun.com/docs/books/tutorial/essential/io/index.html 1.το byte ειμαι μικρο 8(bit) max 256 το ιnt einai 32 bit.με μεγαλυτερο max! επιστρεφει τον αριθμο των byte που διαβασε! 2.οχι δεν ειναι καμουφλαρισμενος! το cast δεν ειναι σωστο..γιατι με τις αλλαγες ου ανεφερες υπαρχει μεγαλη περιπτωση να ΧΑΣΕΙΣ πληροφορια! απο εναν 32bit (Int) πας σε ενα 16 bit (char) unicode character! Μπορει στην περιπτωση σου η τιμη του int να ηταν μικρη κα να μην εχανες τιποτα..αλλα αν υπαρχει κατι μεγαλυτερο? τοτε θα χασεις bitakia! .οχι δεν ειναι και τοσο σωστο να του συμπεριφερεσαι σαν αριθμο! παρολο που μπορει να πεδια τιμων να χρησιμοποιηθει και ετσι! 3.Δεν σε καταλαβαινω..εννοεις κατι του στυλ γενικα περι read και write του περνας ενα buffer δηλαδη ενα array.αυτος διαβαζει και στο γεμιζει! > FileInputStream fis = new FileInputStream(new File("c:/text"); byte[] byter = new byte[100]; fis.read(byter); Σχολιασμος! -------------- Ειναι αληθεια οτι οταν τα δεις πρωτη φορα ...τα διαφορα stream διαθεσιμα.μπερδευεσαι..δεν ξερεις τι να πρωτοχρησιμοποιησεις. Αυτο ερχεται με τον χρονο..και το διαβασμα. καθε stream εχει διαφορετικη φυσιολογια..και προσθετει ενα επιπεδο χρηστικοτητας πανω σε ενα αλλο πιο αρχaio stream. αντι να διαβαζω πχ characters η array απο χαρακτηρες να μπορω να διαβαζω...string με την μια! (φοβερο!)η ακομα και objects .... Οσο αναφορα τον ο.ο κανεις δεν ειπε..οτι ειναι τελικα το τελειο model ..πολλοι ειναι αυτοι που πιστευουν το ιδιο..παρολα αυτα..διχνει οτι ειναι ενα απο τα πιο παραγωγικα μοντελα..μιας και ολα αυτα τα χαρακτηριστικα μας επιτρεπουν να χτισουμε ολο και πιο πολυπλοκα συστημα..χτιζοντας πανω σε ειδη υπαρχουσες δομες! πως πχ παιρνουμε ενα πολυ απλο stream και το passaroume μεσα σε ενα πιο συγχρονο για να εκμεταλευτουμε καποιες νεες ιδιοτητες, ετσι και με αυτο! αν εισαι ακομα στην αρχη..καλο ειναι να αρκεισαι..στα απλα stream..να διαβαζεις byte/byte η με buffer η char..μετα χρησιμοποιεις και τα πιο συνθετα stream. για πιο πολλα..http://www.javahellug.org καλη συνεχεια!
trad Δημοσ. 16 Ιουλίου 2003 Μέλος Δημοσ. 16 Ιουλίου 2003 Ευχαριστώ πάρα πολύ για τη βοήθεια. Θα προτιμούσα πολύ να δουλέψω σε C ή αν αυτό δεν γίνεται τότε C++. Το αρχείο δεν είναι .bin, είναι .shp. Δεν ανοίγεται μόνο του απο κάποιο πρόγραμμα αλλά ανοίγεται παρέα με άλλα 2 αρχειάκια απο ένα πρόγραμμα. Αφού γίνει η επεξεργασία της εικόνας (χάρτης) παράγονται και τα 3 αρχεία μαζί που όλα μαζί φέρουν την πληροφορία. Αυτό το συγκεκριμένο (shp) έχει μια πολύ συγκεκριμένη δομή. Το μόνο που έχει επάνω του είναι μια σειρά αριθμών (int και double) που δίνουν πληροφορίες για την σύνθεση του χάρτη. Για να καταλάβω πλήρως 100% τι πρέπει να κάνω φέρνω συγκεκριμένο παράδειγμα: Αρχείο: byte___________endian_______τιμή 0-3 (int)_________big_________9994 4-7 (int)_________little_________1 8-15 (double)____little_______22.1234 16-23 (double)___little_______44.1234 1) Ας πάρουμε λοιπόν αυτό σαν παράδειγμα. Θέλουμε να δημιουργηθεί αρχείο με αυτή τη δομή και αυτές τις τιμές 2) Να αναγνωστεί το αρχείο που φτιάξαμε <ι> προτιμηταία γλώσσα C/C++. </ι>
Turrican Δημοσ. 16 Ιουλίου 2003 Δημοσ. 16 Ιουλίου 2003 @javanidhs Ευχαριστώ για τις απαντήσεις σου ιδιαίτερα! Οι δικές μου τώρα πάνω σε αυτά. 1. Πολύ σωστά λές οτι το byte = 8bits και int = 32bits καθώς επίσης οτι και η π.χ. read(byte[] buf) επιστρέφει τον αριθμό των byte που διάβασε. Παρόλαυτά, η read() - σκέτο χωρίς arguments - επιστρέφει την τιμή του ενός (1) και μοναδικού byte που διάβασε. Άρα δεν θα έπρεπε αυτό να είναι σε τύπο byte; Αυτό ήθελα να πώ... 2. Καλά το είχα καταλάβει και εγώ οτι η μέθοδος είναι κάπως "πατέντα" Από οτι είδα κιόλας υπάρχουν και οι Reader / Writer κλάσεις που αναλαμβάνουν να κάνουν "μεταγλώτιση" οταν χρειάζετε (o wrapper του wrapper ω wrapper; ... Δημήτρης ΥΓ. http://www.javahellug.org, yiam yiam! Έρχομαιιιιι!
Γηρυόνης Δημοσ. 16 Ιουλίου 2003 Δημοσ. 16 Ιουλίου 2003 > Γιατί η βασική μέθοδος όλων των stream κλάσεων - read() / write() επιστρέφει (int) αντί για (byte); Διότι στη Java ο τύπος bytes είναι signed που σημαίνει ότι παίρνει τιμες από το -128 - 127. Το πρόσημο μπροστά έχει μόνο σημασία το πως το εκάστοτε λειτουργικό σύστημα μεταφράζει το byte. Έχε υπό όψιν σου ότι οι τύποι char και boolean στη Java είναι *unsigned* δηλαδή παίρνουνε μόνο θετικες τιμές. Δεν μπορείς δηλαδή να διαβάσεις ένα χαρακτήρα στη java με αρνητική τιμή. Άρα το byte θα πρέπει να γίνει unsigned και να παρει μία θετική τιμη από 0 μέχρι 255 (αυτό γίνεται με ένα λογικό AND (&) της μάσκας 0xFF). Αρα η μετατροπή σε int είναι ένας πολυ έξυπνος τρόπος για να αποφύγουμε ζητήματα τύπου signed/unsigned πράξεων. Φυσικα βέβαια όταν μετατρέπεται σε int αυτό που πραγματικα επιστρέφει είναι μόνο τα τελευταία 8 bits. Τα άλλα αγνοούνται.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.