如果您有兴趣,可以了解一些背景知识...
下一段代码是尝试使用循环冗余校验(CRC-15)实现数据包错误代码生成器。这用于检测通信数据损坏。不需要更详细的介绍。
代码和问题
init_PEC15_Table函数是一个查找表生成器。
pec15函数接受数据输入,计算解决方案的地址,并在查找表中找到结果。
data是一个char数组,我为其分配了值1。这将传递给pec15。
现在,我发现只需重新排序cout命令,“ stuffed pec”(即我感兴趣的输出)的值就会改变。通过在线阅读,我了解到这可能是由于内存堆栈意外更改,从而影响结果寄存器,并且可能是由于其他变量的越界操作所致。我是否理解错误?
现在,我是一个初学者,这非常令人生畏。我可能犯了一些我不知道的重大错误,因此请随时将代码撕碎。 另外,如果重要的话,此代码也可以在mbed LPC1768上运行。
#include <iostream>
using namespace std;
unsigned short pec15Table[256];
const unsigned int CRC15_POLY = 0x4599;
void init_PEC15_Table() // Cyclical Redundancy Check lookup table generator function
{
unsigned short rem;
for (int i = 0; i < 256; i++)
{
rem = i << 7;
for (int bit = 8; bit > 0; --bit)
{
if (rem & 0x4000)
{
rem = ((rem << 1));
rem = (rem ^ CRC15_POLY);
}
else
{
rem = ((rem << 1));
}
}
pec15Table[i] = rem & 0xFFFF;
// cout << hex << pec15Table [i] << endl;
}
}
unsigned short pec15(char* data, int lengt = 16) //Takes data as an input,
{
int rem, address;
rem = 16;//PEC seed (intial PEC value)
for (int i = 0; i < lengt; i++)
{
address = ((rem >> 7) ^ data[i]) & 0xff;//calculate PEC table address
rem = (rem << 8) ^ pec15Table[address];
}
return (rem * 2);//The CRC15 has a 0 in the LSB so the final value must be multiplied by 2
}
int main()
{
init_PEC15_Table(); //initialise pec table
char data = (short) 0x1 ; // Write 0x1 to char array containing the data 0x1
char* dataPtr = &data; // Create a pointer to that array
unsigned short result = pec15(dataPtr); //Pass data pointer to pec calculator
cout << "data in: " << (short) *dataPtr << endl; //Print the short representation of the char data array (Outputs 1)
cout << "size of data: " << sizeof(*dataPtr) << endl; //Print the size of the char array (Outputs 1)
cout << "stuffed pec: " << result << endl; //Print the output of the pec calculation
return 0;
}
答案 0 :(得分:7)
您在此处编写的代码不会与您编写的注释同步:
char data = (short) 0x1 ; // Write 0x1 to char array containing the data 0x1
char* dataPtr = &data; // Create a pointer to that array
第一行不向字符数组写入任何内容。相反,它创建了一个数值为{1的char
变量。请注意,这里不需要强制转换为short
,也没有任何作用-您是要写其他东西吗?
第二行不创建指向数组的指针。而是,它创建一个指向data
变量的指针。您可能会认为这是指向长度为1的数组的指针,但这可能并非您的意图。
以上两行本身并没有做任何坏事。但是,下一行是一个实际问题:
unsigned short result = pec15(dataPtr); //Pass data pointer to pec calculator
请记住,pec15
还有第二个参数,该参数应表示传入的数据的长度。由于未指定,因此默认为16。但是,dataPtr
指针仅指向设置为单个char
值,而不是16个char
值,因此这会导致行为未定义。
我不确定如何解决此问题,因为我不太了解您的代码背后的意图。您的意思是制作一个16个元素的数组吗?您是要创建一个填充了值0x1
的数组吗?正确的解决方法取决于该问题的答案。
答案 1 :(得分:4)
尝试:
unsigned short result = pec15(dataPtr, 1);
否则lengt
为16(具有默认值)。我也建议删除lengt
的默认值,因为它在pec15
函数的上下文中几乎没有意义。