Προς το περιεχόμενο

Απορία για μία άσκηση σε C


pagratios

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω μία εργασία στην σχολή, όπου φτιάχνει αρχεία και κάθε ένα από αυτά έχει ένα 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

Δημοσ.
>[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]
}

Δημοσ.
σιγουρα?

Γιατί κάτι μας είπαν αλλά δεν θυμάμαι!Σίγουρα γίνεται να δηλώσεις μία μεταβλητή όσα bit θες

 

μπορεις να δηλωσεις bitfields αλλα οχι arrays απο τετοια

αυτο θα σας ειπαν και στην σχολη

Δημοσ.

Κάτι άλλο πως μπορώ σε έναν πίνακα char* αν στην θέση 0 έχει νούμερο να το αποκρυπτογραφώ και να το κρατάω σε μία μεταβλητή int και μετά ένα νούμερο να το περνάω από μεταβλητή σε έναν πίνακα char*?

Δημοσ.
Κάτι άλλο πως μπορώ σε έναν πίνακα char* αν στην θέση 0 έχει νούμερο να το αποκρυπτογραφώ και να το κρατάω σε μία μεταβλητή int και μετά ένα νούμερο να το περνάω από μεταβλητή σε έναν πίνακα char*?

 

αν εχεις

char* A[10];

και το Α[0] ειναι αριθμος int τοτε

 

χρησιμοποιεις την συναρτηση atoi που νομιζω ειναι μεσα στην stdlib

ως εξης:

int a=atoi(A[0]);

Δημοσ.
Έχω μία εργασία στην σχολή, όπου φτιάχνει αρχεία και κάθε ένα από αυτά έχει ένα 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. Τέλος...

Δημοσ.

Τσεκαρε κατι που εχω κανει παλια σε 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];
	}
}

};

Δημοσ.
Βασικά θέλω σε C!

Ξέχασα να πω πως τα block είναι char*

 

Το post μου το είδες ή δεν σου άρεσε γενικά; Γιατί νομίζω ότι δεν το έγραψα σε Java, ούτε C# αλλά καθαρή C. Τώρα καλή επιτυχία...

Δημοσ.
Το 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];

Δημοσ.
Βασικά θέλω σε C!

Ξέχασα να πω πως τα block είναι char*

 

Απο το παραπανω που σου ποσταρα, κρατα μονο αυτο

>(ptr[byteIdx] & (byte) pow(2.0,bitIdx))==0

btw Ο header struct πως ειναι?

Δημοσ.

typedef struct{

char *header;

char filename[MAX_FILE_NAME];

BOOLEAN free;

int opened;

BOOLEAN dirty;

}headerarray_t;

 

όμως το header που μας ενδιαφέρει είναι το block 0 ενός αρχείου το οποίο το έχω αρχικοποιήσει με memset(buf,0,1024)

Αρχειοθετημένο

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

  • Δημιουργία νέου...