All pastes #732041 Raw Edit

Anonymous

public c v1 · immutable
·published 2007-10-10 16:35 UTC
rendered paste body
#include <stdio.h>#include <string.h>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;}