#include #include struct { int offset; int length; } info[] = { {0, 20}, {20, 18}, {38, 18}, {56, -1}, {-1, 0} }; unsigned int get_int(char *s, int len) { unsigned int ret = (unsigned int) (*s); if (len == 1) ret = (ret & 0xff); else ret = (((ret & 0xff) << ((len - 1) * 8)) | get_int(s + 1, len - 1)); return ret; } void print_int(unsigned int val, int len) { unsigned int v = val; if (len == 0) return; v >>= ((len - 1)* 8); printf("%x%x", (v >> 4) & 0xf, v & 0xf); print_int(val, len - 1); } int main() { int iter = 0; unsigned int checksum = 0; #if 0 char input[1024]; fgets(input, sizeof(input), stdin); input[strlen(input) - 1] = '\0'; #else /*char *input = "1.10ZXG10000HLRAGENT" "00000001DLGLGN0000" "00000001TXBEG 0000" "LOGIN:USER=ZXG10,PSWD=ZXG10 ";*/ char *input = "1.10ZXG10000HLRAGENT0000001CDLGCONFFFF00000004TXBEG FFFFMOD SS:IMSI=470300200000014,CFU=1,CFB=1,CFNRY=1,CFNRC=1 "; #endif for (iter = 0; info[iter].offset > -1; iter++) { int offset = info[iter].offset, end; int next = 4; for (end = 0; end < info[iter].length || (info[iter].length < 0 && input[offset + end]); end += next) { printf("%s: ", input + offset + end); if (info[iter].length > 0 && end + next > info[iter].length) next = info[iter].length - end; checksum ^= get_int(input + offset + end, next); print_int(checksum, 4); printf("\n"); } } checksum = ~checksum; print_int(checksum, 4); printf("\n"); printf("\n"); return 0; }