- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 C 中实现了 CRC32 算法,但经过数小时的查看并尝试修复它,它仍然无法正常工作。它可以编译,但校验和与几个在线 CRC 计算器中的校验和不同。我怀疑错误出在“if (0 != (character & j))”这一行,但我不明白,因为它甚至与维基百科上的代码基本相同。
int CRC32_C(char *message){
int length, i, j;
unsigned long p,g;
char character;
p = 0x00000000;
g = 0x04C11DB7;
length = strlen(message);
for (i = 0; i < length; i++){
character=*message;
//iterieren durch die bits jedes zeichens
for (j= 0x80; j != 0; j >>= 1){
//(p & 0x80000000)? 1 : 0)
if (0 != (character & j))
p = (p << 1) ^ g;
else
p <<=1;
}
message++;
}
return p;
}
//sample main
int main(char ** argv, int argc){
char *msg;
int p;
msg = "HALLO";
p = CRC32_C(msg);
printf("p ist 0x%x \n", p);
return 0;
}
示例输入:“你好”
预期结果:0x4E26F361(根据 this page ,它使用相同的生成多项式,如页面底部所示)
实际结果:0xc25a747d
@chux:我尝试删除 if 子句中的“0 !=”,但它并没有改变结果。
CRC32_C 仅代表“用 C 语言实现”。正如生成多项式所示,它是标准以太网。
谢谢你的帮助
最佳答案
CRC可能是msb to lsb或lsb to msb,在线示例中的生成多项式可能不同。 CRC32_F 是 msb 到 lsb,CRC32_R 是 lsb 到 msb(多项式反转)。如果您能找到采用十六进制的在线 CRC 计算器,请尝试使用十六进制 01 来测试 msb 到 lsb,或者使用十六进制 80 来测试 lsb 到 msb。其他变体将 crc 初始化为 0xffffffff 和/或在计算 crc 后反转(不是)crc。查看以太网crc的描述,尝试使用CRC32_R,但将crc的初始化更改为crc = 0xfffffffful; .
unsigned long CRC32_F(unsigned char *message, size_t length){
size_t i, j;
unsigned long crc,gnp;
crc = 0x00000000ul;
gnp = 0x04C11DB7ul;
for (i = 0; i < length; i++){
crc ^= ((unsigned long)*message)<<24;
for (j = 0; j < 8; j++){
if (crc & 0x80000000ul)
crc = (crc << 1) ^ gnp;
else
crc = (crc << 1);
}
message++;
}
return crc;
}
unsigned long CRC32_R(unsigned char *message, size_t length){
size_t i, j;
unsigned long crc,gnp;
crc = 0x00000000ul;
gnp = 0xEDB88320ul;
for (i = 0; i < length; i++){
crc ^= ((unsigned long)*message)<<0;
for (j = 0; j < 8; j++){
if (crc & 0x00000001ul)
crc = (crc >> 1) ^ gnp;
else
crc = (crc >> 1);
}
message++;
}
return crc;
}
关于CRC-32 和 LFSR 在 C 中逐字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28179701/
我在为我的序列(模式)获取正确的 LFSR 时遇到了一些问题,当我将它实现为 LFSR 和相应的抽头时,它不会生成序列,有什么建议吗?目标 patt 为 {1, 1, 0, 0, 0, 0, 1, 0
虽然我有一个很好的 LSFR C 实现,但我想我会在 Haskell 中尝试同样的方法——只是为了看看它是如何进行的。到目前为止,我想出的比 C 实现慢两个数量级,这就引出了一个问题:如何提高性能?
如上所述,我创建了一个 LFSR 来尝试生成一些数字,但它无法正常工作。 以此开始: unsigned int lfsr = 0x000001 while(1) { lfsr >>= 1 un
我知道,如果您抽取线性反馈移位寄存器生成的系列,您会得到一个新系列和一个新多项式。例如,如果您对由多项式 x4+x+1 的 LFSR 生成的系列中的每五个元素进行采样,您将获得由 x2+x+1 生成的
我试图了解如何更改伽罗瓦 LFSR 代码,以便能够将输出位数指定为下面提到的函数的参数。我的意思是我需要返回的不是 LFSR 的最后一位作为输出位,而是 LFSR 的任何位(例如第二位或第三位)。我真
我有使用从互联网上获得的左反馈移位寄存器生成随机数的代码: #define POLY_MASK_32 0xB4BCD35C #define POLY_MASK_31 0x7A5BC2E3 #inclu
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎离题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a minim
我想了解 galois LFSR 代码的工作原理。在维基百科页面上有一个带有示例的图。有一段 C 代码。 #include uint16_t lfsr = 0xACE1u; unsigned per
存在一个数学问题,就是生成n个唯一随机数序列的问题(随机数是N { 0, ..., n }的元素,(类似排列,但不占用内存) 最近我有点解决了这个问题,我确实得到了一些结果(阅读下面的内容,没有使用形
我正在努力学习如何 right >>和 left #include #include using namespace std; int main() { string seed;
使用线性反馈移位寄存器(LFSR)实现CRC生成有两种方法,如图所示。图中生成多项式的系数为100111,红色“+”圆圈为异或运算符。两者的初始化寄存器值都是 00000。 例如,如果输入数据比特流是
我正在为一个 OFDM 系统编程,包括发射器和接收器端。比特进入的第一个函数是扰码器,它基本上是一个 LFSR,我的多项式是 x^7 + x^4 + 1,简单地说,我对寄存器中的第 7 位和第 4 位
我最近开始为学校做一个 FPGA 项目,我之前从未使用过 VHDL,所以我尽力将我的程序拼凑在一起。总的来说,我的目标是让 prbs 或 LFSR 随机生成。我的 vhdl 代码在 xilinx IS
我在 C 中实现了 CRC32 算法,但经过数小时的查看并尝试修复它,它仍然无法正常工作。它可以编译,但校验和与几个在线 CRC 计算器中的校验和不同。我怀疑错误出在“if (0 != (charac
根据Linear feedback shift register维基百科上的页面, 除了 Galois LFSR 对计算机更友好之外,您能说出使用伽罗瓦数列相对于斐波那契数列的真正优势是什么吗? 换句
我想知道是否有一种方法可以结合两个概念:LFSR 和 Barrel Shifters 我正在寻找一种方法,在 O(1) 时间内将 LFSR 循环移动给定的移动次数。 我希望找到的是一个简单的过程,其中
我是一名优秀的程序员,十分优秀!