Autor Thema: TAR-Format im Kernel auslesen  (Gelesen 3443 mal)

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« am: 24. July 2009, 08:18 »
Hallo Community,
ich habe mich dazu entschieden, meine initial ramdisk im TAR-Format abzulegen, was das ganze beim Zusammenbauen des Abbilds etwas einfacher macht, da ich nicht noch extra ein Programm schreiben muss.
 
Nun habe ich mir den Aufbau des Headers angeschaut und bei TAR wird alles als ASCII abgelegt, was so momentan ein Problem für mich ist. Und zwar habe ich als erstes eine Datei liegen, 8804 Byte groß ist (sagt 7-Zip und das Konsolenprogramm tar).
Nun ist im Header die Größe der Datei auch als char-Array angegeben und zwar mit 12 Feldern, quasi "char size[12];". Wie wandelt man dies um in einen Integer, damit ich weiß, wie groß die Datei ist?
Die Funktion "atoi" kann ich da leider nicht nutzen, da Sie bei meinem Test unter Windows 21144 zurückgegeben hat. In der Spezifikation steht allerdings, dass dieses Array die größe in Bytes enthält, was also dann nicht mittels atoi umgewandelt werden kann. Wie rechnet man das um?
 
Hier die Seite mit der Info über den Header: http://www.gnu.org/software/automake/manual/tar/Standard.html
« Letzte Änderung: 24. July 2009, 08:27 von ChristianF »

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #1 am: 24. July 2009, 08:33 »
Tut mir leid, dass ich gepostet habe...
Die Größe in diesem Feld wird in Bytes angegeben, allerdings ist diese Größe Octal, was heißt, dass ich Sie erst noch umrechnen muss. Gestanden hat das in einer PHP Klasse. *g*
Also erst mittels atoi umwandeln und dann von octal nach hex oder dezimal umwandeln (je nach bedarf).  :-P

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 24. July 2009, 11:19 »
Mit atoi die Zahl umwandeln, und *dann* nochmal wandeln? Falls das wirklich klappen sollte, wird das unschön.

Bei strtol kannst du gleich die Basis 8 angeben. Dann geht das in einem Schritt.

http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/
Dieser Text wird unter jedem Beitrag angezeigt.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #3 am: 24. July 2009, 12:39 »
Nun ja, das muss ich dann wohl erst einmal für den Kernel implementieren. *g*
Bis ich die Zeit dafür gefunden habe, wandele ich das einfach doppelt um :D

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 24. July 2009, 13:05 »
Klappt das denn?

Wenn nicht: Befehlsmäßig könntest du ja auch aus deinem atoi einfach mit Copy und Paste ein atoi_oktal oder so machen. Da muss man ja nur die 10 durch eine 8 ersetzen ;)
Dieser Text wird unter jedem Beitrag angezeigt.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #5 am: 24. July 2009, 15:45 »
Das hieße, ich schreibe mir alle nötigen atoi/atol-Funktionen (atoi_oktal, atoi_hex,...) und schreibe ein strtol oder strtoi, was die zuvor geschriebenen atoi, bzw. atol funktionen aufruft.  :roll:

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 24. July 2009, 16:03 »
Ja, oder du schreibst strtol und rufst dann von atoi diese Funktion auf ;)
Dieser Text wird unter jedem Beitrag angezeigt.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #7 am: 24. July 2009, 18:59 »
Ein strtoi müsste dann wie folgt aussehen:
int strtoi(const char *str, char **endptr, u32int_t base)
{
int len = strlen(str), i = 0, retnum = 0, neg = 1;

if(str[0] == '-')
neg = -1;

while((i < len) && (str[i] >= '0') && (str[i] <= (base+'0')))
{
retnum *= base;
retnum += str[i] - '0';
i++;
}

retnum *= neg;
return(retnum);
}
« Letzte Änderung: 24. July 2009, 19:05 von ChristianF »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 24. July 2009, 19:22 »
Joar, nicht standardkonform, aber so ungefähr ;)

Übrigens gehen Hexadezimalzahlen bzw. allgemein base > 10 damit nicht. Aber wenn du das nicht brauchst, passts ja ;)
Dieser Text wird unter jedem Beitrag angezeigt.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #9 am: 27. July 2009, 08:55 »
Nun ja...
eigentlich brauche ich die Funktion nur für das TAR-Image auszulesen, mehr nicht. *g*

 

Einloggen