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 einefunktion 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 definierttypedef unsigned char byte;