Cómo calcular la suma de comprobación a mano

0

Soy un programador y necesito enviar datos a la máquina, pero tengo que agregar una suma de comprobación al final de los datos. Alguien me puede mostrar un ejemplo de cómo hacerlo para que luego pueda escribir un programa para calcular la suma de control para mí.

Las reglas: Inversión a nivel de bit de la suma de bytes de 1 byte que comienza con el El byte de dirección más significativo y que termina con el byte anterior. la suma de control (Para realizar una inversión a nivel de bit, "OR exclusivo" la suma de un byte con hexadecimal FF)

Gracias

    
pregunta success

2 respuestas

1

La definición lo cubre bastante bien.

  

Inversión bit a bit de la suma de bytes de 1 byte que comienza con el byte de dirección más significativo y termina con el byte que precede a la suma de comprobación. (Para realizar una inversión a nivel de bit, "exclusivo O" la suma de un byte con hexadecimal FF).

Ejemplo

  • Mensaje "Hola" = Hex: 48 65 6C 6C 6F.
  • Al agregarlos usando mi Windows Calc.exe en modo Programador, obtengo & h01F4.
  • Tome el último byte e ignore todo lo demás: & hF4.
  • & hF4 XOR & hFF = & h0B - su suma de comprobación.

Para aclarar el último bit:

&hF4 = 1111 0100
&hFF = 1111 1111
       ---------
XOR  = 0000 1011 = &h0B

Actualizar

  

Por alguna razón, no funciona para mí. Aquí tengo CA 00 01 70 00, los agrego para obtener 13B, tomo el último byte que es 3B y XOR con FF, luego obtengo c4, que es diferente de 8E (un ejemplo que obtuve del manual). ¿Echo de menos algo sobre la regla?

Una búsqueda en la web de la regla arrojó un documento de NESLAB . En la página B-2 leemos:

Figura 1. La región de la suma de comprobación es la única parte utilizada en la suma de comprobación.

Esto debería explicar su confusión. El carácter principal no está incluido en el cálculo. Ahora, si ejecutamos una comprobación en CA 00 01 70 00 podemos soltar CA y nos quedan unos ceros, 01 y 70, que suman a & h71.

& h71 XOR & FF = & h8E. Voila!

    
respondido por el Transistor
1

Su suma de control requerida se calcula sobre los datos como tal:

Ustednoincluyeelcarácterprincipal0xCAenlasumadecomprobación,sololosbytessombreados.

UnsimplebitdecódigoCparacalculartuejemplo:

intmain(){inti;unsignedcharcs;unsignedchara[]={0x00,0x01,0x70,0x00};cs=0;for(i=0;i<sizeof(a);i++){cs+=a[i];}cs^=0xFF;printf("cs = %X \n", cs);
   return 0;
}

Y el resultado es el esperado:

sh-4.3$ gcc -o main *.c                                                                                                                                                                                                   
sh-4.3$ main                                                                                                                                                                                                              
cs = 8E   

Desde que declaré la variable cs como un carácter sin firmar, tira los bits superiores en cada adición. Agregar es lo mismo que en otros ejemplos, puede tirar los bits superiores al final si lo está haciendo manualmente. Solo tenga cuidado en estos casos, exactamente lo que es y lo que no está incluido en la suma de comprobación.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas