04. september 2004 - 16:24
Der er
26 kommentarer og 1 løsning
en lille hurtig en omkring copy en int ind i en char array
mig igen igen :) jeg har mig en char array der hedder buf, jeg smider username osv ind i den (det virker fint) MEN så skal jeg smide en int ind i den (int8, 1 byte) bruger det her: int8 charclass = (int8)row[4]; memcpy(buf_ptr, (char*)&charclass, 1); buf_ptr+=1; int8 gender = (int8)row[5]; memcpy(buf_ptr, (char*)&gender, 1); buf_ptr+=1; smider 0x01 0x00 ind i den og får så 0xAF 0xB1 ud af den.. har prøvet med forskellige metoder, såsom int8 gender = (int8)&row[5]; memcpy(buf_ptr, (char*)&gender, 1); osv osv, men intet tyder på at virke.. nogen der ved det ?
Annonceindlæg fra Deloitte
04. september 2004 - 16:27
#1
Det ser umiddelbart OK ud. Hvordan henter du ?
04. september 2004 - 16:29
#2
int8 charclass = (int8)row[4]; memcpy(buf_ptr, (char*)&charclass, 1); kunne laves som: memcpy(buf_ptr, &row[4], 1); eller *buf_ptr = row[4]; men memcpy'en bør virke OK.
04. september 2004 - 16:29
#3
ved godt den ser lidt incomplete ud, men det er fordi jeg er ved at samle den, gider ikke skrive alle min int8 udtræk inden jeg har fundet fejlen int generatenewcharpack(DWORD ptr, const char * name) { CConnection* c = reinterpret_cast <CConnection*> (ptr); char cip[15]; unsigned int cp = 0; c->PeerInfo (&cip[0], 15, &cp); char* query = new char[100]; sprintf(query,"SELECT * FROM characters WHERE name='%s'", name); if(mysql_query(pConn,query)) { // error doing the query Log2File(TRUE, "(MySQL) ERROR : %s\n", mysql_error(pConn)); return 0; } else { result = mysql_store_result(pConn); row = mysql_fetch_row(result); int8 opcode = 0x11; char buf[32]; char* buf_ptr= buf; // done so we can mover buf_ptr to were we need to memcpy memcpy(buf_ptr,(char*)&opcode,1); buf_ptr+=1; char bufname[13]; char* buf_ptrname= bufname; // done so we can mover buf_ptr to were we need to memcpy int8 addbyte = 0x00; char * name = (char*)row[2]; memcpy(buf_ptrname,(char*)name, sizeof(name)); buf_ptrname+=sizeof(name); for (int i = sizeof(name); i < 13; i++) { if(i < 12) { memcpy(buf_ptrname,(char*)&addbyte, 1); buf_ptrname+=1; } else { memcpy(buf_ptrname,(char*)&addbyte, 1); } } memcpy(buf_ptr, (char*)bufname, sizeof(bufname)); buf_ptr+=sizeof(bufname); // charname is in, works 100% ok // error from here and down. int8 charclass = (int8)row[4]; memcpy(buf_ptr, (char*)&charclass, 1); buf_ptr+=1; int8 gender = (int8)row[5]; memcpy(buf_ptr, (char*)&gender, 1); buf_ptr+=1; Log2File(TRUE, "Buffer contains, sizeof buf : %i, sizeof buffname: %i\n", sizeof(buf), sizeof(bufname)); PacketLog((unsigned char*)&bufname, sizeof(bufname)); PacketLog((unsigned char*)&buf, sizeof(buf)); //sendpacket(buf, sizeof(buf), ptr); // free mysql result's mysql_free_result(result); } return 0; }
04. september 2004 - 16:29
#4
btw, den for løkke er fordi jeg SKAL have en charname med 13 bytes, go den storer oxo ok.
04. september 2004 - 16:30
#5
og memcpy(buf_ptr,(char*)&opcode,1); buf_ptr+=1; er go nok, den smider 0x11 ind i pakken
04. september 2004 - 16:31
#6
og mine database felter ser oxo ok ud type: int feltnavn: charclass har: 1 (i feltet)
04. september 2004 - 16:34
#7
char * name = (char*)row[2]; memcpy(buf_ptrname,(char*)name, sizeof(name)); buf_ptrname+=sizeof(name); for (int i = sizeof(name); i < 13; i++) er du opmærksom på at sizeof(name) altid er 4 uanset hvorlang name er ??
04. september 2004 - 16:34
#8
jeg er 99% sikker på at du mener strlen(name) og ikke sizeof(name)
04. september 2004 - 16:35
#9
ja, det opdagede jeg 10 minutter siden, har ikke lige fået det rettet, kan jeg da lige gøre nu
04. september 2004 - 16:37
#10
okay rettet det: eksempel på min log for packetlog buf 11 48 65 6A 73 61 00 00 00 00 00 00 00 00 AC AE CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
04. september 2004 - 16:38
#11
(jeg ved godt de CC er der fordi min buffer er større en de data jeg smider ind i den) men når jeg er færdig er bufferen 32 bytes stor
04. september 2004 - 16:38
#12
Men prøv lige at lav: int8 charclass = (int8)row[4]; memcpy(buf_ptr, (char*)&charclass, 1); buf_ptr+=1; int8 gender = (int8)row[5]; memcpy(buf_ptr, (char*)&gender, 1); buf_ptr+=1; om til: int8 charclass = (int8)row[4]; memcpy(buf_ptr, (char*)&charclass, 1); printf("%2X\n",(int)*buf_ptr); buf_ptr+=1; int8 gender = (int8)row[5]; memcpy(buf_ptr, (char*)&gender, 1); printf("%2X\n",(int)*buf_ptr); buf_ptr+=1; og se om ikke de er OK. Jeg tror at enten bliver strenge ødelagt senere eller du henter forkert ud.
04. september 2004 - 16:40
#13
jeg bruger win32 api, de der printf er til dos ikk :) jeg bruger bare min packet logger.
04. september 2004 - 16:43
#14
jo
04. september 2004 - 16:43
#15
brugte det her int8 charclass = (int8)row[4]; memcpy(buf_ptr, (char*)&charclass, 1); Log2File(TRUE, "[0x%2X] charclass", charclass); buf_ptr+=1; int8 gender = (int8)row[5]; memcpy(buf_ptr, (char*)&gender, 1); Log2File(TRUE, "[0x%2X] gender", gender); buf_ptr+=1; fik [16:47:58] [0xAC] charclass [16:47:58] [0xAE] gender
04. september 2004 - 16:44
#16
prøver da lige det sammed med (int8)row[4]
04. september 2004 - 16:46
#17
hmm får det samme
04. september 2004 - 16:48
#18
hvis jeg logger med (int8)&row[4] får jeg det neden under [16:53:15] [0x60] charclass [16:53:15] [0x64] gender jeg kan da godt se der er noget helt galt der, men fatter ikke hvorfor..
04. september 2004 - 16:52
#19
Øh int8 charclass = (int8)row[4]; (int8)&row[4] der er da stor forskel på om det er row[4] eller &row[4]
04. september 2004 - 16:52
#20
ja, men det er jo ikke det jeg ikke fatter, jeg fatter ikke hvorfor den ikke er 0x01 0x00 :P
04. september 2004 - 16:57
#21
Jo men hvis Log2File(TRUE, "[0x%2X] charclass", charclass); Log2File(TRUE, "[0x%2X] row[4]", (int8)row[4]; giver det samme så er det jo et lid andet sted vi skal lede efter fejlen.
04. september 2004 - 17:00
#22
har tjekket igen, i min database står de rigtige oplysninger type int charclass : 1 type int gender : 0 henter man dem ud som en int, burde de jo blive 0x01, 0x02, så det må være (skulle jeg mene) i: 1) min query eller 2) et eller andet ligger og rodder der i hukommelsen
04. september 2004 - 17:10
#23
hum hvis jeg henter dem ud som en char * får jeg hex valuen af dem 31 (1) 30 (0)
04. september 2004 - 17:13
#24
Hm. Så kan du vel bruge: int8 charclass = (int8)atoi((char *)row[4]); int8 gender = (int8)atoi((char *)row[5]); ?
04. september 2004 - 17:14
#25
Jeg har iøvrigt lige checket - jeg tror faktisk altid at MySQL returnerer tekst og ikke binære tal !
04. september 2004 - 17:15
#26
dælme hvor du kan... ville ønske jeg var så smart, ville jeg ALDRIG have tænkt på. smider du ikke et svar ? :)
04. september 2004 - 17:19
#27
kommer her
Kurser inden for grundlæggende programmering