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

Las reglas: inversión bit a bit de la suma de bytes de 1 byte comenzando 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 bit a bit, «O exclusivo» la suma de un byte con FF hexadecimal.)

Gracias

Comentarios

  • ¿Qué tiene esto que ver con la etiqueta: electrónica de potencia?

Respuesta

La definición bastante bien lo cubre.

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

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 

Actualización

Por alguna razón, no me funciona. 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). ¿Me pierdo algo de la regla?

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

ingrese la descripción de la imagen aquí

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 personaje principal no se incluye en el cálculo. Ahora, si ejecutamos una verificación en CA 00 01 70 00, podemos eliminar CA y nos quedan algunos ceros, 01 y 70, que suman & h71.

& h71 XOR & FF = & h8E. ¡Voila!

Comentarios

  • Gracias. Estaba confundido acerca de " Inversión bit a bit de la suma de bytes de 1 byte ". No sabía que significaba tomar el último byte, pero lo borraste. ¡¡Muchas gracias !!
  • Solo por curiosidad, ¿por qué XOR con h ' FF? ¿No es ' esto es lo mismo que invertir cada bit (0- > 1, 1- > 0). Parece que ambos me hacen lo mismo. Luego, podría representarlo como " Byte final invertido bit a bit de la suma de todos los bytes en un mensaje "
  • Sí, tiene razón, pero XOR solo usa una instrucción para invertir los 8 bits. No puedo ' pensar en un método más eficiente. ¿Puedes?
  • Por alguna razón, no me funciona. 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). ¿Extraño algo de la regla?
  • @transistor: Gracias por aclararme. Bueno, yo ' no conozco el lenguaje de programación, simplemente tiene más sentido para mí así. Sé que en perl ' s solo ~ variable. Supongo que en la práctica no ' no hace una diferencia de ninguna manera

Responder

La suma de verificación requerida se calcula sobre los datos de la siguiente manera:

ingrese la descripción de la imagen aquí

Usted no incluye el carácter principal 0xCA en la suma de comprobación, solo el sombreado bytes.

Un simple fragmento de código C para calcular su ejemplo:

int main() { int i; unsigned char cs; unsigned char a[] = {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 

Ya que declaré la variable cs como un carácter sin firmar, descarta los bits superiores en cada adición. Agregar es igual que otros ejemplos, puede desechar los bits superiores al final si lo hace manualmente. En estos casos, tenga mucho cuidado con lo que es y lo que no está incluido en la suma de comprobación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *