pagratios Δημοσ. 17 Οκτωβρίου 2009 Δημοσ. 17 Οκτωβρίου 2009 Έχω μία εργασία στην σχολή, όπου φτιάχνει αρχεία και κάθε ένα από αυτά έχει ένα header που αποτελείτε από 1024 byte και ακόμα 8192 block των 1024 byte!Το κάθε bit του header δείχνει αν το αντίστοιχο block είναι ή οχι έγκυρο! θέλω να ρωτήσω πως μπορώ αποθηκεύσω το header σε έναν πίνακα των 8192 bit ώστε αν θέλω να δω ένα block π.χ 459 να λέω if(bit(459) == 1) {is valid} Μάλλον πρέπει να φτιάξω ένα struct με bit[8192] : 1 ή κάπως έτσι! Εσείς τι λέτε?Γίνεται κάτι τέτοιο? Ξέρω πως γίνεται και με ολισθήσεις αλλά θα ήθελα αν υπήρχε τρόπος με τα bit
TheMagician Δημοσ. 17 Οκτωβρίου 2009 Δημοσ. 17 Οκτωβρίου 2009 Δεν μπορεις να το κανεις αυτο η C δεν επιτρεπει arrays απο bit fields παιξε με shifts και and/or
pagratios Δημοσ. 17 Οκτωβρίου 2009 Μέλος Δημοσ. 17 Οκτωβρίου 2009 σιγουρα? Γιατί κάτι μας είπαν αλλά δεν θυμάμαι!Σίγουρα γίνεται να δηλώσεις μία μεταβλητή όσα bit θες
kagelos Δημοσ. 17 Οκτωβρίου 2009 Δημοσ. 17 Οκτωβρίου 2009 >[color="#8000ff"]char[/color][[color="#ff8000"]1024[/color]] header; [color="#008000"][i]//459[/i][/color] [color="#8000ff"]int[/color] index = [color="#ff8000"]459[/color] / [color="#ff8000"]8[/color]; [color="#8000ff"]char[/color] bit = [color="#ff8000"]1[/color] << ([color="#ff8000"]459[/color] % [color="#ff8000"]8[/color]); [color="#0000ff"][b]if[/b][/color] (header[index] & bit) { [color="#008000"][i]//valid[/i][/color] }
TheMagician Δημοσ. 17 Οκτωβρίου 2009 Δημοσ. 17 Οκτωβρίου 2009 σιγουρα?Γιατί κάτι μας είπαν αλλά δεν θυμάμαι!Σίγουρα γίνεται να δηλώσεις μία μεταβλητή όσα bit θες μπορεις να δηλωσεις bitfields αλλα οχι arrays απο τετοια αυτο θα σας ειπαν και στην σχολη
pagratios Δημοσ. 17 Οκτωβρίου 2009 Μέλος Δημοσ. 17 Οκτωβρίου 2009 Κάτι άλλο πως μπορώ σε έναν πίνακα char* αν στην θέση 0 έχει νούμερο να το αποκρυπτογραφώ και να το κρατάω σε μία μεταβλητή int και μετά ένα νούμερο να το περνάω από μεταβλητή σε έναν πίνακα char*?
jtsc21 Δημοσ. 17 Οκτωβρίου 2009 Δημοσ. 17 Οκτωβρίου 2009 Κάτι άλλο πως μπορώ σε έναν πίνακα char* αν στην θέση 0 έχει νούμερο να το αποκρυπτογραφώ και να το κρατάω σε μία μεταβλητή int και μετά ένα νούμερο να το περνάω από μεταβλητή σε έναν πίνακα char*? αν εχεις char* A[10]; και το Α[0] ειναι αριθμος int τοτε χρησιμοποιεις την συναρτηση atoi που νομιζω ειναι μεσα στην stdlib ως εξης: int a=atoi(A[0]);
bokarinho Δημοσ. 17 Οκτωβρίου 2009 Δημοσ. 17 Οκτωβρίου 2009 Έχω μία εργασία στην σχολή, όπου φτιάχνει αρχεία και κάθε ένα από αυτά έχει ένα header που αποτελείτε από 1024 byte και ακόμα 8192 block των 1024 byte!Το κάθε bit του header δείχνει αν το αντίστοιχο block είναι ή οχι έγκυρο! θέλω να ρωτήσω πως μπορώ αποθηκεύσω το header σε έναν πίνακα των 8192 bit ώστε αν θέλω να δω ένα block π.χ 459 να λέω if(bit(459) == 1) {is valid} Μάλλον πρέπει να φτιάξω ένα struct με bit[8192] : 1 ή κάπως έτσι! Εσείς τι λέτε?Γίνεται κάτι τέτοιο? Ξέρω πως γίνεται και με ολισθήσεις αλλά θα ήθελα αν υπήρχε τρόπος με τα bit Καλησπέρα, λοιπόν αυτό που λες προυποθέτει εσύ να φτιάξεις κάποιες συναρτήσεις που θα κάνουν get και set το bit σε κάποια θέση ενός πίνακα. Θα σου δώσω ένα στοιχείο > void setBitTo(char TBuffer[], unsigned int position, int state) { /* Index. */ unsigned int Index, Byte; /* Mask value, set to 10000000. */ unsigned char mask = 0x80; /* Find the appropriate byte. */ Byte =(int)(position/8); /* Set to the correct bit. */ for(Index = 0; Index < position % 8; Index++) mask >>= 1; if(!state) TBuffer[byte] &= ~mask; else TBuffer[byte] |= mask; } Αυτό πρόκειται για μία συνάρτηση που έχω φτιάξει εγώ και κάνει αυτό που σου λέω, δες το και ρώτα ότι θέλεις. Αρχικά βρίσκουμε το κατάλληλο Byte, κατόπιν το κατάλληλο bit και κατόπιν με βάση το state αν είναι 0 ή 1 το κάνουμε 0 ή 1. Τέλος...
Evgenios1 Δημοσ. 18 Οκτωβρίου 2009 Δημοσ. 18 Οκτωβρίου 2009 Τσεκαρε κατι που εχω κανει παλια σε c++. >[color="#0000ff"]#include[/color] <math.h> [color="#0000ff"]#define[/color] byte [color="#8000ff"]unsigned[/color] [color="#8000ff"]char[/color] [color="#0000ff"][b]struct[/b][/color] buffer { byte* ptr; [color="#8000ff"]int[/color] len; }; [color="#0000ff"][b]class[/b][/color] BitStream { byte* ptr; [color="#8000ff"]int[/color] len; [color="#8000ff"]int[/color] bitIdx; [color="#8000ff"]int[/color] byteIdx; [color="#8000ff"]int[/color] NextByte([color="#0000ff"][b]void[/b][/color]) { byteIdx++; bitIdx =-[color="#ff8000"]1[/color]; [color="#0000ff"][b]if[/b][/color](byteIdx==len) [color="#0000ff"][b]return[/b][/color] [color="#ff8000"]1[/color]; [color="#0000ff"][b]return[/b][/color] [color="#ff8000"]0[/color]; } [color="#0000ff"][b]public[/b][/color]: BitStream(byte* data,[color="#8000ff"]int[/color] len_) { ptr = data; len = len_; bitIdx=-[color="#ff8000"]1[/color]; byteIdx=[color="#ff8000"]0[/color]; } [color="#8000ff"]int[/color] NextBit([color="#8000ff"]bool[/color] *bit) { bitIdx++; [color="#0000ff"][b]if[/b][/color](bitIdx>[color="#ff8000"]8[/color]) [color="#0000ff"][b]if[/b][/color](BitStream::NextByte()==[color="#ff8000"]1[/color]) [color="#0000ff"][b]return[/b][/color] [color="#ff8000"]1[/color]; [color="#0000ff"][b]if[/b][/color]((ptr[byteIdx] & (byte) pow([color="#ff8000"]2.0[/color],bitIdx))==[color="#ff8000"]0[/color]) { bit[[color="#ff8000"]0[/color]]=[color="#0000ff"][b]false[/b][/color]; [color="#0000ff"][b]return[/b][/color] [color="#ff8000"]0[/color]; } [color="#0000ff"][b]else[/b][/color] { bit[[color="#ff8000"]0[/color]]=[color="#0000ff"][b]true[/b][/color]; [color="#0000ff"][b]return[/b][/color] [color="#ff8000"]0[/color]; } } };
pagratios Δημοσ. 18 Οκτωβρίου 2009 Μέλος Δημοσ. 18 Οκτωβρίου 2009 Βασικά θέλω σε C! Ξέχασα να πω πως τα block είναι char*
Evgenios1 Δημοσ. 18 Οκτωβρίου 2009 Δημοσ. 18 Οκτωβρίου 2009 ψαξε καμια υλοποιηση σε c, για την ευρεση του Mp3 header. Θα βρεις ακριβος αυτο που θελεις.
bokarinho Δημοσ. 18 Οκτωβρίου 2009 Δημοσ. 18 Οκτωβρίου 2009 Βασικά θέλω σε C!Ξέχασα να πω πως τα block είναι char* Το post μου το είδες ή δεν σου άρεσε γενικά; Γιατί νομίζω ότι δεν το έγραψα σε Java, ούτε C# αλλά καθαρή C. Τώρα καλή επιτυχία...
pagratios Δημοσ. 18 Οκτωβρίου 2009 Μέλος Δημοσ. 18 Οκτωβρίου 2009 Το post μου το είδες ή δεν σου άρεσε γενικά; Γιατί νομίζω ότι δεν το έγραψα σε Java, ούτε C# αλλά καθαρή C. Τώρα καλή επιτυχία... Το είδα αλλά το είδα χθες το βράδυ και ξεχάστηκα μετά!Τα mask τι ακριβώς είναι? Και κάτι ακόμα με αυτό γίνεται δουλειά? > for(i=0;i<8;i++) { byte[i].bit = num % 2; num = num/2; } όπου το byte.bit είναι δομή σαν αυτή typedef struct{ unsigned int bit : 1; }byte_t; byte_t byte[8];
Evgenios1 Δημοσ. 18 Οκτωβρίου 2009 Δημοσ. 18 Οκτωβρίου 2009 Βασικά θέλω σε C!Ξέχασα να πω πως τα block είναι char* Απο το παραπανω που σου ποσταρα, κρατα μονο αυτο >(ptr[byteIdx] & (byte) pow(2.0,bitIdx))==0 btw Ο header struct πως ειναι?
pagratios Δημοσ. 18 Οκτωβρίου 2009 Μέλος Δημοσ. 18 Οκτωβρίου 2009 typedef struct{ char *header; char filename[MAX_FILE_NAME]; BOOLEAN free; int opened; BOOLEAN dirty; }headerarray_t; όμως το header που μας ενδιαφέρει είναι το block 0 ενός αρχείου το οποίο το έχω αρχικοποιήσει με memset(buf,0,1024)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.