Forum: Mikrocontroller und Digitale Elektronik MMC/SD karte (Ulrig Radig) datei grösse berechnung


von Der G. (jonnyk)


Lesenswert?

Kann mir jemmand erklären was genau dieser befehl hier macht?
wobei size die Grösse der datei ist.

tmp = (Size>>9)+1;

von Der G. (jonnyk)


Lesenswert?

Schon gefunden dank wiki books!

Rechtsshift >>

Verschiebt den Inhalt einer Variable bitweise nach rechts. Bei einer 
ganzen nicht negativen Zahl entspricht eine Verschiebung einer Division 
durch 2n und Abschneiden der Nachkommastellen(falls vorhanden), wobei n 
die Anzahl der Verschiebungen ist. Das Ergebnis ist 
implementierungsabhängig, wenn der zu verschiebende Wert negativ ist.

Beispiel:

y = x >> 1;
x y
01010111 00101011

von Der G. (jonnyk)


Lesenswert?

nehmen wir jetzt an tmp ist ein int. dann kann ich ja immer nur volle 
dateien einlesen. d.h. 4096 byte, 2048, 32768...
richtig?

Was ist wenn ich eine datei einlesen möchte die 4350 byte hat?

wie kann ich sowas realisieren?

Weiss es jemand?
Es sind doch mit sicherheit leute hier die eine SD karte schon mal 
angesprochen haben mit einem MC. könnt ihr mir sagen wie ihr das 
realisiert habt?

Bedanke mich im vorraus

von Christian L. (lorio)


Lesenswert?

Der Grosse wrote:
> Kann mir jemmand erklären was genau dieser befehl hier macht?
> wobei size die Grösse der datei ist.
>
> tmp = (Size >> 9) + 1;

Ich tippe mal: Die Blockanzahl ausrechnen, die für eine Datei benötigt 
wird.(bei Blockgröße von 512 Byte)

Size>>9 entspricht einer Ganzzahldivision durch 512.
Dann wird noch 1 dazu addiert.

Beispiel:
Dateigröße 768 Byte

tmp = (768 >> 9) + 1
tmp =      1     + 1
tmp =         2

stimmt!


Sonderfall:
Dateigröße ist ein Vielfaches von 512 Byte
Beispiel:

Dateigröße 1024 Byte

tmp = (1024 >> 9) + 1
tmp =      2      + 1
tmp =          3

stimmt nicht, denn es werden nur 2 Blöcke benötigt


Gruß
LORIO

EDIT:

Ein Integer kann jede beliebige Ganzzahl aufnehmen, die innerhalb des 
(unsigned / signed) Integer-Wertebereichs liegt.

Beim GCC sind das bei
signed: 2^16 ... 0 ... 2^16 - 1
unsigned: 0 ... 2^32 - 1

von Der G. (jonnyk)


Lesenswert?

Da hast du es ja schon erwähnt

>Dateigröße 1024 Byte

>tmp = (1024 >> 9) + 1
>tmp =      2      + 1
>tmp =          3

>stimmt nicht, denn es werden nur 2 Blöcke benötigt

wie mache ich es den dass es in beiden fählen passt?

von Der G. (jonnyk)


Lesenswert?

Danke Christian!

                           dateigrosse = (Size%512);
      if(dateigrosse==0)
      {
        // Berechnen der Blockanzahl:
        tmp = (Size>>9);
      }
      else
      {
        // Berechnen der Blockanzahl:
        tmp = (Size>>9)+1;
      }
Damit geht es.


Besten Dank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.