Bytes aus Char* lesen



  • Hoppla. Zeile 14 sollte natürlich anders aussehen:

    src[ i ] = src[ i + length ];
    

    greetz, Swordfish



  • Perfekt!

    Danke 😉 Läuft sehr gut 😉

    mfg Ercan



  • Ich will nicht nochmal nerven, aber ich habe ein kleine Frage 😉

    Wie kann ich einen char[4] in einem int umwandeln?

    Also ich habe vor aus einem char mit der größe von 4, einen int zu machen...

    Danke schön 😉

    Edit:

    ahhh egal, mir fällts wieder ein ^^

    i = (arr[0] << 24) | (arr[1] << 16) | (arr[2] << 8) | arr[3];
    


  • e-izmir-a schrieb:

    i = (arr[0] << 24) | (arr[1] << 16) | (arr[2] << 8) | arr[3];
    

    Bist Du Dir sicher? 😉

    greetz, Swordfish



  • Ich sehe gerade das klapp nicht 😛

    Wie ist es denn richtig 😉 ?

    mfg Ercan



  • Habs ^^ muss umgekehrt sein 😛

    Little Endian:

    i = arr[0] | (arr[1] << 8) | (arr[2] << 16) | (arr[3] << 24);
    

    Big Endian:

    i = arr[3] | (arr[2] << 8) | (arr[1] << 16) | (arr[0] << 24);
    

    Aber ich habe folgendes Problem:

    Ich habe eine Datei mit 8 bytes:

    0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x10
    

    Ich öffne die Datei, und speichere den Inhalt in eine Variabel ( char data[ filesize + 1 ]...

    Wenn ich jetzt die Funktion readbytes() benutze, kommt eine segnementation fault

    Ich weiß nicht wieso, aber hier der Code:

    int main() {
      FILE *file;
    
      file = fopen("test.txt", "rb" );
    
    	int i=0;
    	char data[ filelength (fileno ( file )) + 1 ];
    	char byte;
    
    	for(;i<=filelength (fileno ( file )); i++) {
    		fread(&byte, 1, 1, file);
    		data[i]=byte;
    	}
    
    	fclose(file);
    
    	char *des;
    	des = readbytes(data, 4);
    
    	printf("%x", des[0] );
    }
    

    Ausgegeben sollte eigentlich 0x10, aber ich kriege einen fault 😕

    Woran könnte es liegen?

    Übrigens, wenn der Inhalt keine 0x00 enthält, geht das ganze ?!

    Also wenn der Inhalt so aussieht, geht das ganze ohne fault:

    0x10 0x10 0x10 0x10 0x20 0x30 0x10 0x20
    

    EDIT:

    Ich sehe gerade, das liegt an strlen(), weil sie da aufhört zu zählen, wo eine 0x00 auftritt... Wie kann man das umgehen? Sizeof() geht auch nicht, da die größe vom Array immer gleich ist...

    mfg Ercan



  • versuchs doch mal damit

    char* readbytes( char* src, size_t length )
    { 
       char *p = malloc (length);
       if (p)
          memcpy (p, src, length);
       return p;
    }
    

    also ohne strlen usw. dafür musste dir die länge immer merken.
    🙂



  • Naja ich habe angefangen umzudenken, ich arbeite direkt an den Daten vom fread...

    naja danke an alle 😉

    mfg Ercan



  • Achja 😉
    Ich brauche noch was... ich möchte jetzt aus einem 4 byte char einen float machen...

    Für int hatte ich ja das:

    i = arr[0] | (arr[1] << 8) | (arr[2] << 16) | (arr[3] << 24);
    

    Kann mir da einer sagen, wie es geht 😉 ?

    mfg Ercan



  • Naja auch das ist gelöst...

    Hab aber einm riesen Problem...

    Also ich habe eine structur, namens NlTrack.
    Sobald ich eine variabel davon erstelle,kommt ein Segnementation fault (Bei Windows: nicht senden Dialog)...

    Ich habe gemerkt, das die Array Größe eine rolle spielt...

    Hier die Struktur:

    /* NLTRACK type */
    typedef struct 
    {
    	/* NLIM */
    	char major;
    	char minor;
    	char revision;
    	char markup;
     	char reserved;
    	int use16friction;		
    
    	/* TRCK */
      int style;
      int numTrains;
      int numCars;		
    
    	Train train[99];
    	Color trackSpineColor, trackRailColor, trackCrosstieColor;
    	Color supportsColor;
    	Color trainSeatColor;
    	Color trainRestraintColor;
    	Color trainColor;
    	Color trainGearColor;
    	char reserved0, reserved1, reserved2, reserved3;
    	int trackMode;
    	int useTunnelColor;
    	Color tunnelColor;
    
    	/* INFO */
    	char *authorComments;
    
    	/* BEZR */
    	int numBeziers;
    	Bezier beziers[9999];
    
    	/* SEGM */
    	// Not Implemented
    
    	/* SUPP */
    	// Not Implemented
    
    	/* FUND */
      int totalFundNodes;
      FundNode fundNodes[9999];
    
    	/* RASC */
    	// Not Implemented
    
    	/* FREN */
      int totalFreeNodes;
      FreeNode freeNodes[9999];
    
    	/* TUBE */
    	int totalTubes;
    	Tube tubes[9999];
    
    	/* CATW */
    	// Not implemented
    
    	/* SCEN */
    	int totalTrees;
    	Tree trees[9999];
    
    	/* SCOB */
    	int totalObjects;
    	SCOBObject objects[9999];
    
    	/* ENV */
    	char *envFilename, *reservedString;
    
    	/* TERA */
    	int sizeX, sizeZ;
    	float scaleX, scaleZ;
    	char *groundTextureFilename;
    	float numGroundTextureRepeats;
    	char *detailTextureFilename;
    	float numDetailTextureRepeats;
    	int enableWater;
    	float seaLevel;
    	char *waterTextureFilename;
    	float numWaterTextureRepeats;
    	char waterReflectiveness;
    	int useWaves;
    	float waveScale;
    	float terrainHeight[300][300];
    } NlTrack;
    

    Meint ihr, ich habe zu wenig RAM Speicher? Auf meinem Linux PC funktioniert das, obwohl sie weniger Speicher hat (Linux PC: 512 MB, Windoof PC: 1024 MB).

    Wieso funktioniert es bei Windows nicht?

    mfg Ercan



  • Jetzt einfach mal ins Blaue geraten, kann es sein dass der Stack das unter Windows nicht mitmacht und ein Stack Overflow passiert? Imho liegen ja Strukturen wie auch normale Variablen bei deklaration auf dem Stack... 😕



  • Wenn ich die Array größen veringere, geht es ja, aber die müssten schon so bleiben... Kann ich nicht die Array Größen während der Laufzeit seten?



  • Ja, du könntest den Speicher zur Laufzeit alloziieren. Dann sind malloc( ) , calloc( ) , realloc( ) und free( ) Deine Freunde.

    Wahrscheinlich kannst Du die größe des Stacks auch in den Einstellungen Deines Compilers festlegen.

    greetz, Swordfish



  • Swordfish schrieb:

    Ja, du könntest den Speicher zur Laufzeit alloziieren. Dann sind malloc( ) , calloc( ) , realloc( ) und free( ) Deine Freunde.

    Wahrscheinlich kannst Du die größe des Stacks auch in den Einstellungen Deines Compilers festlegen.

    greetz, Swordfish

    wie kann ich also z.b. Tree trees[]; zur Laufzeit alloziieren?

    So geht es ja nicht?!

    trees = (Tree) malloc(9999);
    

    mfg Ercan



  • Tree *trees = malloc( n * sizeof( *trees ) );
    

    Den Rückgabewert von malloc( ) castet man nicht! n ist die Anzahl der Trees, die Du haben möchtest. Aufräumen nicht vergessen.

    greetz, Swordfish



  • Swordfish schrieb:

    Tree *trees = malloc( n * sizeof( *trees ) );
    

    Den Rückgabewert von malloc( ) castet man nicht! n ist die Anzahl der Trees, die Du haben möchtest. Aufräumen nicht vergessen.

    greetz, Swordfish

    Man muss nicht casten. Das man das nicht tut, sagst du einfach so.

    Wenn man castet, wird das ganze vom Compiler kontrolliert und evtuelle Fehler werden bemerkt.

    //Ohne Cast: (Der Compiler bemerkt den Fehler nicht)
    long *int_ptr=malloc(sizeof(short));
    
    //Mit Cast: (Der Compiler bemerkt den Fehler.)
    long *int_ptr=(short *)malloc(sizeof(short));
    


  • Das Alles und Jeder schrieb:

    //Mit Cast: (Der Compiler bemerkt den Fehler.)
    long *int_ptr=(short *)malloc(sizeof(short));[/cpp]

    bemerkt er den auch?

    char p = (char)malloc(sizeof(char*));
    

    🙂



  • Das Alles und Jeder schrieb:

    Das man das nicht tut, sagst du einfach so.

    Ja, das sag' ich einfach so, weil es hier schon oft genug diskutiert wurde.

    greetz, Swordfish





  • Danke Tim 😉

    greetz, Swordfish


Anmelden zum Antworten