Está en la página 1de 7

INSTITUTO POLITCNICO NACIONAL

ESCUELA SUPERIOR DE CMPUTO

Redes de Computadoras

CRC32

Por:
Garrido Gutirrez Vctor Hugo

Profesora:
M. en C. NIDIA ASUNCIN CORTEZ DUARTE
Marzo 2014

ndice

Contenido

Problema:.................................................................................................................. 1
Hiptesis: .................................................................................................................. 1
Software (libreras, paquetes, herramientas): ................................................................. 1
Procedimiento: .......................................................................................................... 2
Resultados:................................................................................................................ 4
Conclusiones: ............................................................................................................ 4
Cdigo: ..................................................................................................................... 4

Problema:
Disear un programa en C que calcule el CRC-32 de una trama que es definida por el programador,
el usuario final solo ver el resultado final del CRC-32, este resultado ser mostrado en binario y en
hexadecimal, el lenguaje de C nos permite mostrar resultados en hexadecimal, ms no en binario; es
por eso que necesitaremos crear una funcin que nos ayude a imprimir este resultado
Hiptesis:
Para resolver este problema, se analiz el funcionamiento del CRC-32, en este anlisis vimos que
ya se tiene definido el polinomio por el que se tiene que dividir, el valor de este polinomio en
hexadecimal es 0x104C11DB7, este polinomio dividir la trama que es definida por el
programador, al hacer la divisin binaria se observa que se ejecuta una operacin XOR entre el
CRC y la trama, para realizar la divisin tenemos que localizar el primer 1 que se encuentra en la
trama y de ah tomar 32 bits, como se observa tanto el valor del polinomio como el que tomamos de
las tramas es de 33 bits y en el lenguaje C no tenemos una variable que maneje esta cantidad de bits,
pero si se analiza la divisin nos damos cuenta que al hacer el XOR entre el BMS del polinomio y
el de la trama siempre nos arrojar como resultado un 0, es por eso que desecharemos ese primer bit
y asignaremos el siguiente bit de la trama, con esto podremos hacer el XOR y despus seguimos
recorriendo el residuo hasta de nuevo encontrar un 1 en el bit 32 y repetimos el proceso
mencionado.
Para la funcin de imprimir en binario haremos un ciclo en el que se recorrer cada bit de un entero,
si el bit que se est checando en el momento est prendido entonces se imprimir un 1, en caso
contrario se imprimir un 1.
Software (libreras, paquetes, herramientas):
C++
#include<stdio.h>
#include<stlib.h>
Microsoft Visual Visio

Procedimiento:

Resultados:

En la pantalla anterior nos muestra el residuo cuando la trama que ingresamos es 0xf0, 0x00, 0x00,
0x00, 0x00, el resultado se muestra en binario y despus en hexadecimal

Conclusiones:
Esta prctica, igual que en la prctica anterior fue complicada ya que fue necesario pensar a nivel de
bit y no es algo a lo que estemos acostumbrados, en cuanto a lo planteado en la hiptesis fue
correcto, para plantear la solucin fue necesario analizar varias veces el algoritmo para determinar
la solucin ms ptima y menos recursos ocupara.
Cdigo:
//Programa creado por: Garrido Gutirrez Vctor Hugo
//Grupo: 2CM2
/*Programa que calcula el CRC-32 de una trama, para ello ya se tiene definido el polinomio por el
que se dividir
la trama, este programa puede calcular el CRC-32 para cualquie trama que sea definida previamente
por el programador
El programa tiene la capacidad de mostrarnos el resultado final en binario y en hexadecimal
*/
#include<stdio.h>
#include<stdlib.h>
void imprimeBinario(int a);
main(){
unsigned char a[] = {0xf0,0x00, 0x00, 0x00, 0x00};
unsigned int polinomio = 0x04C11DB7, res = 0, aux = 0;
4

int x,y,z = 0;
printf("\t\t---------------CRC-32----------------");
printf("\n\t\t--------Victor Hugo Garrido----------");
for(x=0; x<sizeof(a); x++){
for(y=0x80;y>0;y=y>>1)
{
if(a[x] & y){
res = res | 1;
}
if(z){
res = res ^ polinomio;
aux = res;
}
z = 0;
if(res&0x80000000){
z=1;
}
res<<=1;
}
}
printf("\n\nEl resultado en binario es: ");
imprimeBinario(aux);
printf("\nEl resultado en hexadecimal: \n0x%x",aux);
system("pause>nul");
}

/* Funcin: imprimeBinario
Recibe como parmetro de entrada una variable de tipo int, nos imprime el valor el binario del
nmero que recibe.*/
void imprimeBinario(int a){
unsigned int x; //Unsignedt es usado para ocupar los 32 bits del entero como positivos
printf("\n");
for(x=0x80000000; x>0; x=x>>1){//0x80000000 es el valor mximo en hexadecimal de un
entero
if(a & x){
printf("1");}
else{
printf("0");}
}
}

También podría gustarte