单片机的checksum怎样计算?用不同的烧录器得到的checksum不同请问单片机中烧录的程序是否一样?
最佳答案 - 由投票者6个月前选出
可以把文件中每个字节值求和,这是最简单的方法
至少要用一个Long(32bit)的求和值,然后取反!
选定一个算法,
一般是个字节求和,然后和一个数取模。
比如 一个文件的每个字节相加为 0x0fe345,那么和0xff 取模,结果为0x45,这个数可以算作一个校验和。
bios里面的校验和的计算方法 各字节的和与0xff取模,然后取补码作为最后一个字节,这样保证文件的总和与0xff取模为0。
一般是逐个字节求做“异或”操作
//-----------------------------------------------------------------------------
// ChkSum()
// Returns an unsigned byte checksum computed on an unsigned byte
// array. The array must be 11 bytes long and is assumed to contain
// a name stored in the format of a MS-DOS directory entry.
// Passed: pFcbName Pointer to an unsigned byte array assumed to be
// 11 bytes long.
// Returns: Sum An 8-bit unsigned checksum of the array pointed
// to by pFcbName.
//------------------------------------------------------------------------------
unsigned char ChkSum (unsigned char *pFcbName)
{
short FcbNameLen;
unsigned char Sum;
Sum = 0;
for (FcbNameLen=11; FcbNameLen!=0; FcbNameLen--) {
// NOTE: The operation is an unsigned char rotate right
Sum = ((Sum & 1) ? 0x80 : 0) + (Sum >> 1) + *pFcbName++;
}
return (Sum);
}