// File: carellano8[P]Proyecto-Redes-I-2017/crc16.cpp
// Function: crc16::recibir(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
void crc16::recibir(binario bin){
    size_t i,li,ls,j,a,b;
    bool error=false;
    binario aux="";
    binario bufferB[MAXMSJ/MAXT*8];
    binario buffer2[MAXMSJ/MAXT*8];
    string bufferMsj;
    ofstream archivo("salidacrc.txt");
    
   
     i=0;j=0;
    while(i<bin.size()){

        li=bin.find("01111110",i);
        ls=bin.find("01111110",i+8);
        bufferB[j]=bin.substr(li,(ls+8)-li);

        //~ cout<<"Inferior "<<li<<" Superior "<<ls<<" Distancia "<<(ls+8)-li<<endl;
        //~ cout<<bufferB[j]<<endl;
        j++;
        i=ls+8;;
    }
    if(j>16){error=true;}// maximo 16 tramas 

    i=0;
    while(!error&&i<j){// Verfificar que no hay error en las banderas 
        if(bufferB[i].size()<30){
            error=true;
        }
        if(!error){
            bufferB[i]=bufferB[i].substr(8,bufferB[i].size()-16);//quita las banderas 
        }
        i++;
    }
   	if(!error){// Quitar relleno de bits
        for (i = 0; i < j; i++)
        {
        	b=0;aux="";a=0;
        	while(a < bufferB[i].size())
        	{
        		if(bufferB[i].at(a)=='1'){
                    b++;
                }else{
                    b=0;
                    }
                aux+=bufferB[i].at(a);		
                if(b==5){
                a++;b=0;
                	}
            a++;
        	}
        	
        	bufferB[i]=aux;

       	}
    }
            
    
    if(!error){// CRC16
        i=0;
        while(!error&&i<j){// Verfificar CRC16
        	// cout<<bufferB[i]<<endl;
        	// cout<<crc(bufferB[i])<<endl;
            if(crc(bufferB[i])!="0000000000000000"){
                error=true;
            }else{
                bufferB[i]=bufferB[i].substr(0,bufferB[i].size()-16);
            }
            i++;
        }
    }
   
       
    if(!error){// Cabecera, Que no hay desorden en las tramas y que hay trama final
        i=0;
        while(!error&&i<j){// 
            a=BitStringToInt(bufferB[i].substr(1,4));
            b=BitStringToInt(bufferB[i].substr(5,1));
            buffer2[a]=bufferB[i].substr(6);
            //cout<<a<<" "<<b<<" "<<buffer2[a]<<endl;
            i++;
        }
        //~ b=BitStringToInt(buffer2[i-1].substr(5,1));
        if(!b){
            error=true;
        }
    }
    if(!error){
        bufferMsj="";
        for (i = 0; i <j ; i++)
        {
            for (a = 0; a <buffer2[i].size() ; a+=8)
            {
                bufferMsj+=(char)(BitStringToInt(buffer2[i].substr(a,8)));
            }   
        }

        cout<<bufferMsj<<endl;
        if(archivo.is_open()){
            archivo<<bufferMsj;
            archivo.close();
        }
    }
    
    
    
    
    if(error){
        cout<<"Se ha detectado algun un error"<<endl;
        if(archivo.is_open()){
            archivo<<"Se ha detectado algun un error"<<endl;
            archivo.close();
        }else{
            cout<<"Se ha detectado algun un error"<<endl;
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x2500, %rsp           # imm = 0x2500
movq %rdi, -0x23d0(%rbp)
movq %rdi, -0x8(%rbp)
movb $0x0, -0x39(%rbp)
leaq -0x61(%rbp), %rdi
movq %rdi, -0x23c8(%rbp)
callq 0x33a0
movq -0x23c8(%rbp), %rdx
leaq 0x48f1(%rip), %rsi      # 0xa159
leaq -0x60(%rbp), %rdi
callq 0x4340
jmp 0x5873
leaq -0x61(%rbp), %rdi
callq 0x3240
leaq -0x1080(%rbp), %rax
movq %rax, %rcx
addq $0x1000, %rcx           # imm = 0x1000
movq %rcx, -0x23e0(%rbp)
movq %rax, -0x23d8(%rbp)
movq -0x23d8(%rbp), %rdi
movq %rdi, -0x23e8(%rbp)
callq 0x32d0
movq -0x23e8(%rbp), %rax
movq -0x23e0(%rbp), %rcx
addq $0x20, %rax
cmpq %rcx, %rax
movq %rax, -0x23d8(%rbp)
jne 0x589b
leaq -0x2080(%rbp), %rax
movq %rax, %rcx
addq $0x1000, %rcx           # imm = 0x1000
movq %rcx, -0x23f8(%rbp)
movq %rax, -0x23f0(%rbp)
movq -0x23f0(%rbp), %rdi
movq %rdi, -0x2400(%rbp)
callq 0x32d0
movq -0x2400(%rbp), %rax
movq -0x23f8(%rbp), %rcx
addq $0x20, %rax
cmpq %rcx, %rax
movq %rax, -0x23f0(%rbp)
jne 0x58eb
leaq -0x20a0(%rbp), %rdi
callq 0x32d0
leaq 0x477f(%rip), %rsi      # 0xa0ae
leaq -0x22a0(%rbp), %rdi
movl $0x10, %edx
callq 0x3250
jmp 0x5942
movq $0x0, -0x10(%rbp)
movq $0x0, -0x28(%rbp)
movq -0x23d0(%rbp), %rdi
movq -0x10(%rbp), %rax
movq %rax, -0x2408(%rbp)
callq 0x3170
movq %rax, %rcx
movq -0x2408(%rbp), %rax
cmpq %rcx, %rax
jae 0x5a64
movq -0x23d0(%rbp), %rdi
movq -0x10(%rbp), %rdx
leaq 0x47cc(%rip), %rsi      # 0xa15a
movq %rsi, -0x2410(%rbp)
callq 0x3420
movq -0x2410(%rbp), %rsi
movq -0x23d0(%rbp), %rdi
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rdx
addq $0x8, %rdx
callq 0x3420
movq -0x23d0(%rbp), %rsi
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
subq %rdx, %rcx
addq $0x8, %rcx
leaq -0x22c0(%rbp), %rdi
callq 0x3200
jmp 0x59e1
movq -0x28(%rbp), %rax
leaq -0x1080(%rbp), %rdi
shlq $0x5, %rax
addq %rax, %rdi
leaq -0x22c0(%rbp), %rsi
callq 0x3290
leaq -0x22c0(%rbp), %rdi
callq 0x3140
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x10(%rbp)
jmp 0x5952
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x61(%rbp), %rdi
callq 0x3240
jmp 0x6369
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x62bc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x62b0
cmpq $0x10, -0x28(%rbp)
jbe 0x5a6f
movb $0x1, -0x39(%rbp)
movq $0x0, -0x10(%rbp)
xorl %eax, %eax
testb $0x1, -0x39(%rbp)
movb %al, -0x2411(%rbp)
jne 0x5a96
movq -0x10(%rbp), %rax
cmpq -0x28(%rbp), %rax
setb %al
movb %al, -0x2411(%rbp)
movb -0x2411(%rbp), %al
testb $0x1, %al
jne 0x5aa5
jmp 0x5b44
movq -0x10(%rbp), %rax
leaq -0x1080(%rbp), %rdi
shlq $0x5, %rax
addq %rax, %rdi
callq 0x3170
cmpq $0x1e, %rax
jae 0x5ac6
movb $0x1, -0x39(%rbp)
testb $0x1, -0x39(%rbp)
jne 0x5b33
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rdi
movq %rdi, -0x2420(%rbp)
callq 0x3170
movq -0x2420(%rbp), %rsi
movq %rax, %rcx
addq $-0x10, %rcx
leaq -0x22e0(%rbp), %rdi
movl $0x8, %edx
callq 0x3200
jmp 0x5b09
movq -0x10(%rbp), %rax
leaq -0x1080(%rbp), %rdi
shlq $0x5, %rax
addq %rax, %rdi
leaq -0x22e0(%rbp), %rsi
callq 0x3290
leaq -0x22e0(%rbp), %rdi
callq 0x3140
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x5a77
testb $0x1, -0x39(%rbp)
jne 0x5c95
movq $0x0, -0x10(%rbp)
movq -0x10(%rbp), %rax
cmpq -0x28(%rbp), %rax
jae 0x5c93
movq $0x0, -0x38(%rbp)
leaq 0x45e6(%rip), %rsi      # 0xa159
leaq -0x60(%rbp), %rdi
callq 0x32c0
jmp 0x5b7e
movq $0x0, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x2428(%rbp)
movq -0x10(%rbp), %rax
leaq -0x1080(%rbp), %rdi
shlq $0x5, %rax
addq %rax, %rdi
callq 0x3170
movq %rax, %rcx
movq -0x2428(%rbp), %rax
cmpq %rcx, %rax
jae 0x5c65
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rdi
movq -0x30(%rbp), %rsi
callq 0x33f0
movq %rax, -0x2430(%rbp)
jmp 0x5bdd
movq -0x2430(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x31, %eax
jne 0x5bfa
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x5c02
movq $0x0, -0x38(%rbp)
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rdi
movq -0x30(%rbp), %rsi
callq 0x33f0
movq %rax, -0x2438(%rbp)
jmp 0x5c24
movq -0x2438(%rbp), %rax
movsbl (%rax), %esi
leaq -0x60(%rbp), %rdi
callq 0x3150
jmp 0x5c39
cmpq $0x5, -0x38(%rbp)
jne 0x5c54
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x5b86
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rdi
leaq -0x60(%rbp), %rsi
callq 0x3040
jmp 0x5c80
jmp 0x5c82
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x5b56
jmp 0x5c95
testb $0x1, -0x39(%rbp)
jne 0x5e00
movq $0x0, -0x10(%rbp)
xorl %eax, %eax
testb $0x1, -0x39(%rbp)
movb %al, -0x2439(%rbp)
jne 0x5cc6
movq -0x10(%rbp), %rax
cmpq -0x28(%rbp), %rax
setb %al
movb %al, -0x2439(%rbp)
movb -0x2439(%rbp), %al
testb $0x1, %al
jne 0x5cd5
jmp 0x5dfe
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rsi
leaq -0x2320(%rbp), %rdi
callq 0x30e0
jmp 0x5cf3
leaq -0x2300(%rbp), %rdi
leaq -0x2320(%rbp), %rsi
callq 0x5150
jmp 0x5d08
leaq 0x4429(%rip), %rsi      # 0xa138
leaq -0x2300(%rbp), %rdi
callq 0x6530
movb %al, -0x243a(%rbp)
jmp 0x5d23
leaq -0x2300(%rbp), %rdi
callq 0x3140
leaq -0x2320(%rbp), %rdi
callq 0x3140
movb -0x243a(%rbp), %al
testb $0x1, %al
jne 0x5d47
jmp 0x5d87
movb $0x1, -0x39(%rbp)
jmp 0x5ded
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x5d76
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x2300(%rbp), %rdi
callq 0x3140
leaq -0x2320(%rbp), %rdi
callq 0x3140
jmp 0x62b0
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rdi
movq %rdi, -0x2448(%rbp)
callq 0x3170
movq -0x2448(%rbp), %rsi
movq %rax, %rcx
addq $-0x10, %rcx
xorl %eax, %eax
movl %eax, %edx
leaq -0x2340(%rbp), %rdi
callq 0x3200
jmp 0x5dc3
movq -0x10(%rbp), %rax
leaq -0x1080(%rbp), %rdi
shlq $0x5, %rax
addq %rax, %rdi
leaq -0x2340(%rbp), %rsi
callq 0x3290
leaq -0x2340(%rbp), %rdi
callq 0x3140
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x5ca7
jmp 0x5e00
testb $0x1, -0x39(%rbp)
jne 0x5f94
movq $0x0, -0x10(%rbp)
xorl %eax, %eax
testb $0x1, -0x39(%rbp)
movb %al, -0x2449(%rbp)
jne 0x5e31
movq -0x10(%rbp), %rax
cmpq -0x28(%rbp), %rax
setb %al
movb %al, -0x2449(%rbp)
movb -0x2449(%rbp), %al
testb $0x1, %al
jne 0x5e40
jmp 0x5f87
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rsi
leaq -0x2360(%rbp), %rdi
movl $0x1, %edx
movl $0x4, %ecx
callq 0x3200
jmp 0x5e68
leaq -0x2360(%rbp), %rdi
callq 0x6380
movl %eax, -0x2450(%rbp)
jmp 0x5e7c
movl -0x2450(%rbp), %eax
cltq
movq %rax, -0x30(%rbp)
leaq -0x2360(%rbp), %rdi
callq 0x3140
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rsi
leaq -0x2380(%rbp), %rdi
movl $0x5, %edx
movl $0x1, %ecx
callq 0x3200
jmp 0x5ebc
leaq -0x2380(%rbp), %rdi
callq 0x6380
movl %eax, -0x2454(%rbp)
jmp 0x5ed0
movl -0x2454(%rbp), %eax
cltq
movq %rax, -0x38(%rbp)
leaq -0x2380(%rbp), %rdi
callq 0x3140
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x1080(%rbp,%rax), %rsi
leaq -0x23a0(%rbp), %rdi
movl $0x6, %edx
movq $-0x1, %rcx
callq 0x3200
jmp 0x5f12
movq -0x30(%rbp), %rax
leaq -0x2080(%rbp), %rdi
shlq $0x5, %rax
addq %rax, %rdi
leaq -0x23a0(%rbp), %rsi
callq 0x3290
leaq -0x23a0(%rbp), %rdi
callq 0x3140
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x5e12
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x2360(%rbp), %rdi
callq 0x3140
jmp 0x62b0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x2380(%rbp), %rdi
callq 0x3140
jmp 0x62b0
cmpq $0x0, -0x38(%rbp)
jne 0x5f92
movb $0x1, -0x39(%rbp)
jmp 0x5f94
testb $0x1, -0x39(%rbp)
jne 0x611d
leaq 0x41b4(%rip), %rsi      # 0xa159
leaq -0x20a0(%rbp), %rdi
callq 0x32c0
jmp 0x5fb3
movq $0x0, -0x10(%rbp)
movq -0x10(%rbp), %rax
cmpq -0x28(%rbp), %rax
jae 0x60a5
movq $0x0, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x2460(%rbp)
movq -0x10(%rbp), %rax
leaq -0x2080(%rbp), %rdi
shlq $0x5, %rax
addq %rax, %rdi
callq 0x3170
movq %rax, %rcx
movq -0x2460(%rbp), %rax
cmpq %rcx, %rax
jae 0x6092
movq -0x10(%rbp), %rax
shlq $0x5, %rax
leaq -0x2080(%rbp,%rax), %rsi
movq -0x30(%rbp), %rdx
leaq -0x23c0(%rbp), %rdi
movl $0x8, %ecx
callq 0x3200
jmp 0x602d
leaq -0x23c0(%rbp), %rdi
callq 0x6380
movl %eax, -0x2464(%rbp)
jmp 0x6041
movl -0x2464(%rbp), %eax
movsbl %al, %esi
leaq -0x20a0(%rbp), %rdi
callq 0x3150
jmp 0x6058
leaq -0x23c0(%rbp), %rdi
callq 0x3140
movq -0x30(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x30(%rbp)
jmp 0x5fd1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x23c0(%rbp), %rdi
callq 0x3140
jmp 0x62b0
jmp 0x6094
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x5fbb
movq 0x6f24(%rip), %rdi      # 0xcfd0
leaq -0x20a0(%rbp), %rsi
callq 0x31d0
movq %rax, -0x2470(%rbp)
jmp 0x60c1
movq -0x2470(%rbp), %rdi
movq 0x6ef1(%rip), %rsi      # 0xcfc0
callq 0x3210
jmp 0x60d6
leaq -0x22a0(%rbp), %rdi
callq 0x3190
movb %al, -0x2471(%rbp)
jmp 0x60ea
movb -0x2471(%rbp), %al
testb $0x1, %al
jne 0x60f6
jmp 0x611b
leaq -0x22a0(%rbp), %rdi
leaq -0x20a0(%rbp), %rsi
callq 0x31d0
jmp 0x610b
leaq -0x22a0(%rbp), %rdi
callq 0x32e0
jmp 0x6119
jmp 0x611b
jmp 0x611d
testb $0x1, -0x39(%rbp)
je 0x61ee
movq 0x6ea2(%rip), %rdi      # 0xcfd0
leaq 0x3f5a(%rip), %rsi      # 0xa08f
callq 0x31f0
movq %rax, -0x2480(%rbp)
jmp 0x6143
movq -0x2480(%rbp), %rdi
movq 0x6e6f(%rip), %rsi      # 0xcfc0
callq 0x3210
jmp 0x6158
leaq -0x22a0(%rbp), %rdi
callq 0x3190
movb %al, -0x2481(%rbp)
jmp 0x616c
movb -0x2481(%rbp), %al
testb $0x1, %al
jne 0x6178
jmp 0x61b9
leaq 0x3f10(%rip), %rsi      # 0xa08f
leaq -0x22a0(%rbp), %rdi
callq 0x31f0
movq %rax, -0x2490(%rbp)
jmp 0x6194
movq -0x2490(%rbp), %rdi
movq 0x6e1e(%rip), %rsi      # 0xcfc0
callq 0x3210
jmp 0x61a9
leaq -0x22a0(%rbp), %rdi
callq 0x32e0
jmp 0x61b7
jmp 0x61ec
movq 0x6e10(%rip), %rdi      # 0xcfd0
leaq 0x3ec8(%rip), %rsi      # 0xa08f
callq 0x31f0
movq %rax, -0x2498(%rbp)
jmp 0x61d5
movq -0x2498(%rbp), %rdi
movq 0x6ddd(%rip), %rsi      # 0xcfc0
callq 0x3210
jmp 0x61ea
jmp 0x61ec
jmp 0x61ee
leaq -0x22a0(%rbp), %rdi
callq 0x3300
leaq -0x20a0(%rbp), %rdi
callq 0x3140
leaq -0x2080(%rbp), %rax
movq %rax, -0x24a8(%rbp)
addq $0x1000, %rax           # imm = 0x1000
movq %rax, -0x24a0(%rbp)
movq -0x24a0(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x24b0(%rbp)
callq 0x3140
movq -0x24a8(%rbp), %rcx
movq -0x24b0(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x24a0(%rbp)
jne 0x6221
leaq -0x1080(%rbp), %rax
movq %rax, -0x24c0(%rbp)
addq $0x1000, %rax           # imm = 0x1000
movq %rax, -0x24b8(%rbp)
movq -0x24b8(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x24c8(%rbp)
callq 0x3140
movq -0x24c0(%rbp), %rcx
movq -0x24c8(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x24b8(%rbp)
jne 0x626d
leaq -0x60(%rbp), %rdi
callq 0x3140
addq $0x2500, %rsp           # imm = 0x2500
popq %rbp
retq
leaq -0x22a0(%rbp), %rdi
callq 0x3300
leaq -0x20a0(%rbp), %rdi
callq 0x3140
leaq -0x2080(%rbp), %rax
movq %rax, -0x24d8(%rbp)
addq $0x1000, %rax           # imm = 0x1000
movq %rax, -0x24d0(%rbp)
movq -0x24d0(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x24e0(%rbp)
callq 0x3140
movq -0x24d8(%rbp), %rcx
movq -0x24e0(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x24d0(%rbp)
jne 0x62e3
leaq -0x1080(%rbp), %rax
movq %rax, -0x24f0(%rbp)
addq $0x1000, %rax           # imm = 0x1000
movq %rax, -0x24e8(%rbp)
movq -0x24e8(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x24f8(%rbp)
callq 0x3140
movq -0x24f0(%rbp), %rcx
movq -0x24f8(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x24e8(%rbp)
jne 0x632f
leaq -0x60(%rbp), %rdi
callq 0x3140
movq -0x70(%rbp), %rdi
callq 0x3390
nopw %cs:(%rax,%rax)