是否有 8/16/32 校验和算法会产生不等于所有 FF 或零的结果?
Is there a 8/16/32 checksum algorithm that will yield a result that is not equal to all FFs or zeros?
我想计算一个校验和(最好是 8 位),它将产生一个非 FF 且非 0 的结果。它将用于微控制器的循环日志 SPI 闪存文件系统。在文件系统中,0 表示记录的开始,而 FF 表示已擦除的内存。因此,当我计算校验和时,我不希望结果与记录的开头或未使用的内存混淆。
我查看了 Fletcher 的校验和,但结果仍可能为 0。或者我虽然使用 7 位校验和并使用最后一位来确保我没有零或 FF 结果。
有人知道这样的实现吗?
我最后做了以下事情:
uint8_t CrcCalc(uint8_t* buffer, size_t len)
{
// .... some calculation here with polynomial of own choice
}
uint8_t CrcCalcNon0orFF(uint8_t* buffer, size_t len)
{
uint8_t tempCrc = CrcCalc(buffer,len);
if (tempCrc == 0xFF) tempCrc++;
if (tempCrc == 0) tempCrc++;
return tempCrc;
}
以上也可以扩展到 16 位和 32 位问题。
我不确定它是否会满足数学纯粹主义者,但它对我有用。
我想计算一个校验和(最好是 8 位),它将产生一个非 FF 且非 0 的结果。它将用于微控制器的循环日志 SPI 闪存文件系统。在文件系统中,0 表示记录的开始,而 FF 表示已擦除的内存。因此,当我计算校验和时,我不希望结果与记录的开头或未使用的内存混淆。
我查看了 Fletcher 的校验和,但结果仍可能为 0。或者我虽然使用 7 位校验和并使用最后一位来确保我没有零或 FF 结果。
有人知道这样的实现吗?
我最后做了以下事情:
uint8_t CrcCalc(uint8_t* buffer, size_t len)
{
// .... some calculation here with polynomial of own choice
}
uint8_t CrcCalcNon0orFF(uint8_t* buffer, size_t len)
{
uint8_t tempCrc = CrcCalc(buffer,len);
if (tempCrc == 0xFF) tempCrc++;
if (tempCrc == 0) tempCrc++;
return tempCrc;
}
以上也可以扩展到 16 位和 32 位问题。
我不确定它是否会满足数学纯粹主义者,但它对我有用。