如果我有一定数量的字节要串行传输,我如何确定使用哪个CRC(CRC8,CRC16等,基本上是多少位CRC?)并且仍然有高错误检测百分比?有这个公式吗?
我有一个缓存应用程序,它使用CRC64值来确保数据完整性.我正在考虑添加一个额外的字段,一个时间戳来传递各种缓存服务器之间的数据,并进行比较以查看数据是否已更改.
但是,这需要协议更改.虽然这不是什么大不了的事,但我已经有了一个CRC64可以用作指示某些事情发生了变化.
有谁知道产生相同CRC64的两个数据块周围的统计数据?如果没有,我怎么能计算它或估计它的可能性?
我正在为一个只有几个字节RAM的小型8位微控制器编写代码.它有一个简单的工作,即传输7个16位字,然后传输这些字的CRC.在编译时选择单词的值.CRC具体是"字0到字6的除法的余数,因为无符号数除以多项式x ^ 8 +x²+ x + 1(初始值0xFF)."
是否可以使用C预处理器在编译时计算这些字节的CRC ?
#define CALC_CRC(a,b,c,d,e,f,g) /* what goes here? */
#define W0 0x6301
#define W1 0x12AF
#define W2 0x7753
#define W3 0x0007
#define W4 0x0007
#define W5 0x5621
#define W6 0x5422
#define CRC CALC_CRC(W0, W1, W2, W3, W4, W5, W6)
Run Code Online (Sandbox Code Playgroud) 我想知道差异以及如何为不同的crc选择多项式生成器?
在一些C代码中,他们查找表来计算crc,其中一些是通过xor真值表来完成的.但在这两种情况下它都是1byte数据阵列.令人困惑.有人可以解释一下吗?
谢谢.!
我正在尝试在C#中实现Crc16.我已经尝试过很多不同的实现,但是大多数都给了我不同的值.以下是我已经使用过的一些代码.
private static int POLYNOMIAL = 0x8408;
private static int PRESET_VALUE = 0xFFFF;
public static int crc16(byte[] data)
{
int current_crc_value = PRESET_VALUE;
for (int i = 0; i < data.Length; i++)
{
current_crc_value ^= data[i] & 0xFF;
for (int j = 0; j < 8; j++)
{
if ((current_crc_value & 1) != 0)
{
current_crc_value = (current_crc_value >> 1) ^ POLYNOMIAL;
}
else
{
current_crc_value = current_crc_value >> 1;
}
}
}
current_crc_value = ~current_crc_value;
return current_crc_value & 0xFFFF; …Run Code Online (Sandbox Code Playgroud) 我需要为作为参数传递的数据和长度计算CCITT 16位校验和值.如果我用测试数据"123456789"填充我的数组TempStr,使用多项式0x8408,其长度不包括空终止字符,我得到结果字符串6E90(十六进制).与null终止字符一起,我得到907A.当我将多项式换算为0x1201时,我得到带有和不带终止字符的结果29E2(十六进制)和EFE8(十六进制).
我的问题是:我是否需要使用或不使用空终止字符来计算CRC以获得正确的值?我在算法中使用多项式0x1201或反向多项式0x8408吗?给定数据0x29B1的CRC是否正确?我需要正确的值来确定函数是否正常工作.算法是否正确计算此特定CRC类型?wData =(unsigned int)0xff&*pData ++ ?? 如果有人可以向我解释有什么问题以及如何解决我的问题我会非常感激.谢谢
这是使用和显示calculate_CRC16函数的代码:
CHAR_t TestStr[] = {"123456789"};
unsigned short CrcTest = calculate_CRC16(TestStr,sizeof(TestStr)-1);
QString CrcDisplay = QString("CrcTest : %1").arg(CrcTest);
ui->txtDebug->setText(CrcDisplay);
Run Code Online (Sandbox Code Playgroud)
这是calculate_CRC16函数:
UINT16_t MainWindow::calculate_CRC16(CHAR_t* pData, UINT16_t wLength)
{
UCHAR_t i;
UINT16_t wData;
UINT16_t wCrc = 0xffff;
if (wLength == 0)
return (~wCrc);
do
{
for (i=0, wData=(unsigned int)0xff & *pData++; i < 8; i++, wData >>= 1)
{
if ((wCrc & 0x0001) ^ (wData & 0x0001))
wCrc = (wCrc >> 1) ^ CRC_POLY;
else wCrc >>= …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PHP CRC16 CCITT函数来计算校验和。
设备向我发送了包含校验和的数据包:
10 00 00 00 00 00 00 00 12 51 09 08 00 18 00 04 02 14 00 0c 00 0c 02 1c 00 02 00 00 00 00 00 00 00 a0 77
校验和位于末尾: a0 77
我试过使用
没有成功,CRC 16计算返回:E6 F4而不是 a0 77
查找时,我返回了正确的十六进制信息:
100000000000000012510908001800040214000c000c021c0002000000000000
在网站http://www.lammertbies.nl/comm/info/crc-calculation.html上,但我无法复制它。(确保将输入类型选择为十六进制)
您能帮我弄清楚如何获取十六进制值字符串的crc16 CCITT吗
100000000000000012510908001800040214000c000c021c0002000000000000
我在寻找校验和 a0 77
在我的应用程序中,MainActivity包含许多按钮,单击其中使用图像创建另一个活动.点击图片是一个简单的动画缩放.并且存在一个问题:频繁点击崩溃活动(不是应用程序)的两个图像都有错误
E/libEGL: cache file failed CRC check
Run Code Online (Sandbox Code Playgroud)
我比较了所有图像,它们的大小和分辨率大致相同.它们都是jpg格式.但错误只会增加两个.此外,错误不会发生在所有物理设备上(我测试了三个),但仅限于xiaomi redmi note 2
我用Google搜索了这个错误并发现了这个:
// Check the file magic and CRC
size_t cacheSize = fileSize - headerSize;
if (memcmp(buf, cacheFileMagic, 4) != 0) {
ALOGE("cache file has bad mojo");
close(fd);
return;
}
uint32_t* crc = reinterpret_cast<uint32_t*>(buf + 4);
if (crc32c(buf + headerSize, cacheSize) != *crc) {
ALOGE("cache file failed CRC check");
close(fd);
return;
}
Run Code Online (Sandbox Code Playgroud)
这个错误意味着什么以及如何对抗它?