不多说。有用的人就拿走。没用的人就随便看看吧。上代码。
用于解析ORACLE TNS协议。DATA部分。
解释一下参数
int GetCmdList(unsigned char *data, int cb, char *cmdList)
data 为 DATA 的指针。 cb为DATA部分数据长度。cmdList 为返回 SQL语句指针。
剩下的怎么解析的就自己看代码明白吧。
代码:
int GetCmdList(unsigned char *data, int cb, char *cmdList) { int i = 0, x = 0, j = 0, cbSql = 0, iLocation = 0; for (i = 0; i < cb; i++) { if (*(unsigned short int *)&data[i] != 0x0100) continue; i++; if (data[i] == 0x01) { if (data[i + 1] == 0xfe) x = 2; else x = 1; j = data[i + x]; if (x == 2 && cbSql != 0) j = cbSql + 2; FILE* fpdump = fopen("/usr/local/src/oracle/dbdump.txt", "a+"); fprintf(fpdump, "j = %02X i = %02X x = %02X cbSql = %02X data[i + x] = %d data[i + x + j + 1] = %d data[i + x + j + 2] = %d data[i + x + j + 3] = %d\n\n", j, i, x, cbSql, data[i + x], data[i + x + j + 1], data[i + x + j + 2], data[i + x + j + 3]); if (*(unsigned short int *)&data[i + x + j + 1] == 0x0101) { int k; for (k = 0; k < j + x + 2; k++) { fprintf(fpdump, "%02X ", (unsigned char)data[i + k]); if ((k + 1) % 16 == 0) fprintf(fpdump, "\n"); } fputc('\n', fpdump); for (k = 0; k < j + x + 2; k++) { fprintf(fpdump, "%c", (unsigned char)data[i + k]); } fputc('\n', fpdump); fputc('\n', fpdump); if (j > 5) { strcpy(cmdList, &data[i + x + 1]); char * p = strrchr(cmdList, 0x0a); if (p) *p = NULL; int y = 0; for (y = 0; y < strlen(cmdList); y++) { if (cmdList[y] < 0x20) { strcpy(&cmdList[y], &cmdList[y + 1]); } } iLocation = i + x + 1; return iLocation; } if (j == 1) cbSql = data[i + x + 1]; i = i + x + j + 2; } fclose(fpdump); } } return iLocation; }