【问题标题】:Galois LFSR explanation of codeGalois LFSR 代码解释
【发布时间】:2013-06-03 07:11:05
【问题描述】:

我试图了解 galois LFSR 代码的工作原理。在维基百科页面上有一个带有示例的图。有一个C sn-p代码。

#include <stdint.h>
uint16_t lfsr = 0xACE1u;
unsigned period = 0;

do {
unsigned lsb = lfsr & 1;  /* Get lsb (i.e., the output bit). */
lfsr >>= 1;               /* Shift register */
if (lsb == 1)             /* Only apply toggle mask if output bit is 1. */
lfsr ^= 0xB400u;        /* Apply toggle mask, value has 1 at bits corresponding
                         * to taps, 0 elsewhere. */
++period;
} while(lfsr != 0xACE1u);

我无法理解维基百科上给出的数字并与代码相关联。切换蒙版在做什么?任何人都可以解释该操作如何使用示例位序列及其移位版本。我不了解字段,也不了解代码。我在网上查了一下,但如果不进入领域术语,就找不到对该算法的任何好的解释。请帮忙。

【问题讨论】:

  • 我正在尝试实现 Galois LFSR 来混淆一个字符串,我想了解 LFSR 是如何工作的,在上面的 wiki 中,0xACE1u 是启动状态,我可以知道什么是 '0xB400u' 吗?跨度>

标签: c math shift galois-field


【解决方案1】:

如果您实际运行代码并添加一些行以查看lfsr 移位寄存器变量的中间内容,事情可能会变得更清楚:

#include <stdint.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    uint16_t lfsr = 0xACE1u;
    unsigned period = 0;
    char s[16+1];

    do {
          unsigned lsb = lfsr & 1;  /* Get lsb (i.e., the output bit). */
          lfsr >>= 1;               /* Shift register */
          if (lsb == 1)             /* Only apply toggle mask if output bit is 1. */
            lfsr ^= 0xB400u;        /* Apply toggle mask, value has 1 at bits corresponding
                                    /* to taps, 0 elsewhere. */
          ++period;

          for (int i = 0; i < 16; i++)
          {
             s[15 - i] = (lfsr & (1 << i)) ? '1' : '0';
          }
          s[16] = '\0';
          printf("\n%10d: %s", period, s);
    } while(lfsr != 0xACE1u);

    return 0;
}

输出如下:

     1: 1110001001110000
     2: 0111000100111000
     3: 0011100010011100
     4: 0001110001001110
     5: 0000111000100111
     6: 1011001100010011
     7: 1110110110001001
     8: 1100001011000100
    ....

 65527: 1000000110011100
 65528: 0100000011001110
 65529: 0010000001100111
 65530: 1010010000110011
 65531: 1110011000011001
 65532: 1100011100001100
 65533: 0110001110000110
 65534: 0011000111000011
 65535: 1010110011100001   (= 0xACE1u)

移位运算符"&gt;&gt;" 将所有位向右移动一位。对于无符号整数,这与除以 2 相同。 "lfsr &amp; 1" 返回最低有效位(= 位 0)。 "lfsr ^= 0xB400u" 反转 lfsr 的 16 位中的 4 位,因为运算符 "^" 计算按位异或。二进制中的0xB4001011 0100 0000 0000。因此,最高有效位(= 15 位)、13 位、12 位和 10 位被反转。

【讨论】:

  • 感谢您的解释。我能知道为什么 >> 用于除以 2。要执行的实际操作是 lfsr*x mod p(x),其中 lfsr 是当前状态,p(x) 是特征多项式。我不明白为什么当 lsb 为 1 时抽头被翻转,而当 lsb 为 0 时保持正常。模运算与抽头的翻转有何关系,我无法理解。
  • 尝试理解维基百科文章 (en.wikipedia.org/wiki/Linear_feedback_shift_register) 中的第一个 4 位示例。然后将其扩展为 16 位。首先查看外门和移位寄存器可能会有所收获。
  • 我可以知道上面例子中的这个十六进制值 '0xB400u' 是什么吗?
  • @RaviKiran: 0xB400u 是二进制 101101000000000。对于 4 位,如果输入位为1,则切换相应移位寄存器单元的状态。具体取值来自Wikipedia example,但不参考广泛使用的CRC算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 2012-07-20
  • 2010-10-11
  • 2011-09-25
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多