我有一个发送数据单元的假设情况,每个数据单元都有一千个字节.故障率很少,但是当发生错误时,它不太可能是单个位错误,并且更可能是连续几位中的错误.
起初我想过使用校验和,但显然可能会错过大于一位的位错误.奇偶校验也不起作用,因此CRC可能是最佳选择.
使用循环冗余校验是否有效千字节?或者还有其他方法可以更好地运作吗?
checksum data-link-layer crc error-detection telecommunication
有人可以帮助我使用Delphi实现CRC-CCITT(0xFFFF)吗?
已经获得Java版本,但是如何将其移植到Delphi会让人感到困惑
public static int CRC16CCITT(byte[] bytes) {
int crc = 0xFFFF; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15 ^ bit) crc ^= polynomial;
}
}
crc &= 0xffff; …Run Code Online (Sandbox Code Playgroud) 我正在为一个只有几个字节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) 我在java中计算字节数组的CRC-16实现时遇到问题.基本上我试图将字节发送到开始写入标签的RFID.我可以通过在mac上查看tcpdump命令来查看数组的校验和值.但我的目标是自己生成它.这是我的字节数组,它应该生成0xbe,0xd9:
byte[] bytes = new byte[]{(byte) 0x55,(byte) 0x08,(byte) 0x68, (byte) 0x14,
(byte) 0x93, (byte) 0x01, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06,
(byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00,
(byte) 0x13, (byte) 0x50, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x22, (byte) 0x09, (byte) 0x11};
Run Code Online (Sandbox Code Playgroud)
0x55是标题.正如文档所说,它将被排除在外.
每当我在java上尝试这个数组(使用0xbe,0xd9)时,RFID都可以工作.我的问题是生成那些校验和值.我搜索了几乎整个网络,但没有机会.我找不到任何产生0xbe,0xd9的算法.
任何想法都是我最受欢迎的.提前致谢.
我需要对由Windows CE可执行文件实现的CRC /校验和算法进行逆向工程.作为提议协议,它没有说明CRC /校验和算法.但是,有控制台接口报告正确/计算的校验和,如果消息协议正确,我可以使用随机位构造自己的消息:
我观察到了,
更改消息中的单个位会完全更改校验和字节.
算法似乎与位置有关,因为我在各种消息数据位置输入一些单个1位消息,其余的位为零,并且所有时间控制台都报告了不同的校验和.如果它是简单的加法校验和,则校验和将是相同的.
我应用了常见的XOR,LRC,附加校验和算法,常见的CRC多项式(Standerd,CCITT,X-modem)并经历了[CRC逆向工程论文] [2],但不幸的是我不能超过推导多项式,因为消息类型是固定的,所以无法创建单个1位消息.
我的问题:
是否有任何CRC /校验和算法属性,我可以测试消息,以确定算法是校验和还是基于多项式的CRC?
有没有办法将程序反汇编中看到的错误信息与相应的汇编指令联系起来?
在控制台上报告正确的校验和时,有什么方法可以调试/查明反汇编代码?内存转储还是什么?
我想知道差异以及如何为不同的crc选择多项式生成器?
在一些C代码中,他们查找表来计算crc,其中一些是通过xor真值表来完成的.但在这两种情况下它都是1byte数据阵列.令人困惑.有人可以解释一下吗?
谢谢.!
我需要为作为参数传递的数据和长度计算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) 假设我想创建一组无序的无符号整数的多重集合.为此,我需要创建一个哈希函数来计算无序多集的哈希值.事实上,它也必须对CRC有利.
一个显而易见的解决方案是将项目放在向量中,对它们进行排序并返回结果的哈希值.这似乎有效,但它很昂贵.
另一种方法是对值进行xor,但显然如果我有一个项目两次或没有结果将是相同的 - 这是不好的.
任何想法如何实现这个更便宜 - 我有一个应用程序将成千上万套,相对较大的应用程序.
我正试图在设备和我的服务器之间进行无线电通信.设备中的数据如下所示:
fa-00-01-09-16-aa-00-14-10-01-01-00-01-16-ff-ff-ff-ff-ff-ff-cb-14
Run Code Online (Sandbox Code Playgroud)
最后两个字节是CRC.现在我需要向我的设备发送回复并计算其CRC.设备的数据表没有说太多,它只提供C函数来计算它,但我很难理解我应该为这个函数提供什么
unsigned int CRC_Check(unsigned char *ucCRC_Buf, unsigned char ucBufLength)
{
unsigned int uiX, uiY, uiCRC;
unsigned char ucStart = 0;
uiCRC = 0xFFFF; //set all 1
if (ucBufLength <= 0 || ucStart > ucBufLength)
{
uiCRC = 0;
}
else
{
ucBufLength += ucStart;
for (uiX = (unsigned int)ucStart; uiX < ucBufLength; uiX++)
{
uiCRC = (unsigned int)(uiCRC ^ ucCRC_Buf[uiX]);
for (uiY = 0; uiY <= 7; uiY++)
{
if((uiCRC & 1) != 0)
uiCRC = (unsigned int)((uiCRC …Run Code Online (Sandbox Code Playgroud)