Avatar billede bjering Nybegynder
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 ?
Avatar billede arne_v Ekspert
04. september 2004 - 16:27 #1
Det ser umiddelbart OK ud.

Hvordan henter du ?
Avatar billede arne_v Ekspert
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.
Avatar billede bjering Nybegynder
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;
}
Avatar billede bjering Nybegynder
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.
Avatar billede bjering Nybegynder
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
Avatar billede bjering Nybegynder
04. september 2004 - 16:31 #6
og mine database felter ser oxo ok ud

type: int
feltnavn: charclass
har: 1 (i feltet)
Avatar billede arne_v Ekspert
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 ??
Avatar billede arne_v Ekspert
04. september 2004 - 16:34 #8
jeg er 99% sikker på at du mener strlen(name) og ikke sizeof(name)
Avatar billede bjering Nybegynder
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
Avatar billede bjering Nybegynder
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
Avatar billede bjering Nybegynder
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
Avatar billede arne_v Ekspert
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.
Avatar billede bjering Nybegynder
04. september 2004 - 16:40 #13
jeg bruger win32 api, de der printf er til dos ikk :)

jeg bruger bare min packet logger.
Avatar billede arne_v Ekspert
04. september 2004 - 16:43 #14
jo
Avatar billede bjering Nybegynder
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
Avatar billede bjering Nybegynder
04. september 2004 - 16:44 #16
prøver da lige det sammed med (int8)row[4]
Avatar billede bjering Nybegynder
04. september 2004 - 16:46 #17
hmm får det samme
Avatar billede bjering Nybegynder
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..
Avatar billede arne_v Ekspert
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]
Avatar billede bjering Nybegynder
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
Avatar billede arne_v Ekspert
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.
Avatar billede bjering Nybegynder
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
Avatar billede bjering Nybegynder
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)
Avatar billede arne_v Ekspert
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]);

?
Avatar billede arne_v Ekspert
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 !
Avatar billede bjering Nybegynder
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 ? :)
Avatar billede arne_v Ekspert
04. september 2004 - 17:19 #27
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester