Win32 ReadFile, was liest das ein? Übergabe Problem



  • Win32 ReadFile, was liest das ein? Übergabe Problem

    Hi Ich schreib grad an einem kleinen programm
    das aus einer Datei daten einliesst und diese in ein fenster schreibt.

    so nun meine frage, Was liest ReadFile ein? bzw wie?

    ich hab eine datei da steht dies drin, mal hex.

    hex :00 00 00 01 10 C0 80
    das ist in dezimal
    dez: 0,0,0,1,16,192,128
    wenn ich das mit readfile einlese in ein char K[]
    steht das auch so drin, ich hab mir eine

    funktion geschrieben
    String IntToHexStr(int Value)
    diese rufe ich so auf:
    Strting bla += IntToHexStr(K[i]);

    kommt die 192 als -64 und 128 als -128 in der funktion an der rest richtig...

    weiss einer rat?

    String __fastcall TForm1::IntToHexStr( int Value)
    {
    char hex[16] = "0123456789ABCDEF";
    String Result;
    if ( Value <0 ) Value *= -1;
    int ergebnis = Value / 16;
    int rest = Value % 16;
    Result = hex[ergebnis];
    Result += hex[rest];
    return Result;
    }
    


  • das ist eigentlich auch richtig so, du arbeitest mit vorzeichnbehafteten zahlen
    int Value. Wenn du jetzt eine 8 Bit Zahl (char) in eine int kopierst so finde sign extension statt, da das
    MSB bei allen Werten > 127 gesetzt ist hat du auch einen negativen wert. Ersetze alle deine int durch unsigned int´s und es müßte funktionieren



  • Danke für die antwort,

    aber wenn ich die ints unsigned macht kommt bei value ca. 4,29 milliarden raus....



  • Kannst du mal den Aufruf posten.



  • das ganze ist eine windows app

    und das wird ausgeführt wenn ich einen button an klicke.

    {
    HANDLE in = CreateFile("c:\\David\\code\\david.usr",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
            if (in ==INVALID_HANDLE_VALUE)
                    ShowLastError("CreateFile");
            int filesize = GetFileSize(in, NULL);
            int blockgroesse = 2048;
            int blockanzahl  = filesize/blockgroesse;
            DWORD NumberOfBytesRead;
            char K[2048];
    	int offset = 0;
            bool success = true, eof=false;
    	String (*usernameid)[2]=new String [blockanzahl][2];
    // i ist die position im im char[]
    	int i;
    
            for( int k = 0; k < blockanzahl; k++ )
                    {
                    SetFilePointer(in,offset,NULL,FILE_BEGIN);
                    success=ReadFile(in,K,blockgroesse,&NumberOfBytesRead,0);
                    if (!success) ShowLastError("ReadFile");
                    else{
    
    // da der scheiss rückwärts drin steht läuft die for rückwärts
    		        i = 9;
    	        	for ( int x = 4; x > 0; x--){
    		        	usernameid[k][0] += IntToHexStr( K[i]);
    			        i--;
            		        }
    // hier kommt der Username
                            i =131;
            		while ( K[i] != 01){
            			i++;
    	        		}
            		i++;
            		while ( K[i] != 00){
    	        		usernameid[k][1] += K[i];
    		        	i++;
                                    }
    
                            offset += blockgroesse;
                            Memo1->Lines->Add("username: "+usernameid[k][1]);
                            Memo1->Lines->Add("userid: "+usernameid[k][0]);
                            }
                   }
    
    CloseHandle(in);
    delete[] usernameid;
    }
    
    String __fastcall TForm1::IntToHexStr( unsigned int Value)
    {
    char hex[16] = "0123456789ABCDEF";
    String Result;
    unsigned int ergebnis = Value / 16;
    unsigned int rest = Value % 16;
    Result = hex[ergebnis];
    Result += hex[rest];
    return Result;
    }
    


  • habs geschafft,

    ich hab als datentype "byte" genommen da laut

    http://www.datasource.de/programmierung/tab33_cppdatentypen.htm

    das ist ein 8 bit unsigned char...

    danke für die hilfe....

    aber kommisch ist das schon



  • du hättest auch unsigned char anstelle von byte nehmen können, denn byte ist
    bei MS in rpcndr.h wie folgt definiert

    typedef unsigned char byte;
    

Anmelden zum Antworten