How to insert odd bytes value into binary data?

26 Jun 2012

Hi all.

I have been making MySQL client program. Refer to MySQL protocol spec, packet data is defined like this.

This means that it is necessary to insert some odd bytes integer number and some null terminated strings into one binary data. I tried many time for example like below, but couldn't insert these data into one binary data correctly. Please tell me how to implement in this case?

I'm sorry in poor writing, because I'm studying English.

MySQL Protocol Spec

Bytes                 Name
 -----                 ----
 3                     Packet Length
 1                     Packet Number

Bytes                        Name
 -----                        ----
 4                            client_flags
 4                            max_packet_size
 1                            charset_number
 23                           (filler) always 0x00...
 n (Null-Terminated String)   user
 n (Length Coded Binary)      scramble_buff (1 + x bytes)
 n (Null-Terminated String)   databasename (optional)

My code

typedef unsigned char byte;

struct pacHeader {
    byte Len[3];
    byte Num;
};

struct pacCliAuth {
    byte Flag[4];
    byte Size[4];
    byte CSet;
    byte Fill[23];
};

class DATA {
protected:
    byte BUF[1024];
    int mEndPoint;
public:
    DATA() {
        mEndPoint = 0;
    };
    void Set(byte* data, int size) {
        for (int i = 0; i < size; i++) {
            BUF[mEndPoint+i] = (byte) data[i];
        }
        mEndPoint = mEndPoint+size;
    }
    void SetNull(int num) {
        for (int i = 0; i < num; i++) {
            BUF[mEndPoint+i] = 0x00;
        }
        mEndPoint = mEndPoint+num;
    };
    char* GetStr() {
        return (char*) BUF;
    }
};

main() {
    string user = "user";
    string db = "test_db";

    pacCliAuth pacAuth;
    *pacAuth.Flag = (0x86, 0x09, 0x00, 0x00); // 0x86090000
    *pacAuth.Size = (0x00, 0x00, 0x02, 0x00); // 512
    pacAuth.CSet = 8;

    pacHeader pacHead;    
    int len = sizeof(pacHead) + sizeof(pacAuth) + user.size() + db.size() + 3;
    *pacHead.Len = (0x00, 0x00, len);
    pacHead.Num = 1;
    DATA data;
    data.Set(pacHead.Len, 3);
    data.Set(&pacHead.Num, 1);
    data.Set(pacAuth.Flag, 4);
    data.Set(pacAuth.Size, 4);
    data.Set(&pacAuth.CSet, 1);
    data.SetNull(23);
    data.Set((byte*)user.c_str(), user.size());
    data.SetNull(2);
    data.Set((byte*)db.c_str(), db.size());
    data.SetNull(1);

    Buf = data.GetStr();
    for (int i = 0; i < len; i++) {
        printf("%02x",Buf[i]);
    }
}