天道酬勤,学无止境

CRC 16 -DECT with poly x^16 + x^10 + x^8 + x^7 + x^3 + 1

believe me I have tried to code this, tried Google, and haven't had any luck. I'm trying to implement a CRC16 using this poly

x^16 + x^10 + x^8 + x^7 + x^3 + 1

using the C language. Since I understand PHP better I'm trying to get a function going, but I'm not getting the right answer of 28713. This code is generating a CRC of 32713.

function crc16($string,$crc=0) {

for ( $x=0; $x<strlen( $string ); $x++ ) {

    $crc = $crc ^ ord( $string[$x] );
    echo $crc.'<br />';
    for ($y = 0; $y < 8 ; $y++) {

        if ( ($crc & 0x0001) == 0x0001 ) $crc = ( ($crc >> 1 ) ^ 0x10589  );
        else                             $crc =    $crc >> 1;
    }
}

    return $crc;
}


echo 'CRC:'.crc16('10100011');

Please I beg anyone to give a hand with this..thanks in advance.

标签

评论

  1. Some CRCs are defined to process the bits from each byte from MSB to LSB, and some are defined to process bits from LSB to MSB (the latter is generally the order which is described as "reflected" and uses a reversed polynomial). Your code puts new bits in at the LSB end of the CRC and shifts right, which is suitable for a reflected CRC, but CRC-16-DECT appears to be one of the non-reflected ones.

  2. Your input of "10100011" suggests binary, but is being processed as an 8-byte ASCII string.

To see what happens when treating 10100011 as binary instead, and working from MSB first, here's a hand calculation (as 8 bits of input doesn't require very much effort):

polynomial coefficients
        |
        |            10100010  <--- quotient (irrelevant)
        v          __________
 10000010110001001 ) 10100011  <-------- input
                   ^ 10000010110001001
                     -----------------
                   =   100001110001001
                     ^ 10000010110001001
                       -----------------
                     =      101110101101
                          ^ 10000010110001001
                            -----------------
   remainder (CRC) -----> =   111000000101001
     = 0x7029 = 28713

So treating the input as binary and working MSB first is the right thing to do.

Here is some C code to do the job (as I'm not really into PHP, and ultimately you want C code anyway):

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

static uint16_t crc16(const uint8_t *data, size_t len)
{
    size_t i, j;
    uint16_t crc = 0;

    for (i = 0; i < len; i++) {
        crc ^= (data[i] << 8);              /* data at top end, not bottom */
        for (j = 0; j < 8; j++) {
            if ((crc & 0x8000) == 0x8000)   /* top bit, not bottom */
                crc = (crc << 1) ^ 0x0589;  /* shift left, not right */
            else
                crc <<= 1;                  /* shift left, not right */
        }
    }

    return crc;
}

int main(void)
{
    const uint8_t in[] = { 0xa3 };          /* = 10100011 in binary */
    uint16_t crc = crc16(in, sizeof(in));

    printf("%u (0x%x)\n", crc, crc);
    return 0;
}

Result:

$ gcc -Wall -o crc16 crc16.c
$ ./crc16  
28713 (0x7029)
$ 

Try changing 0x10589 to 0xA001:

function crc16($string,$crc=0) {

    for ( $x=0; $x<strlen( $string ); $x++ ) {

        $crc = $crc ^ ord( $string[$x] );
        for ($y = 0; $y < 8; $y++) {

            if ( ($crc & 0x0001) == 0x0001 ) $crc = ( ($crc >> 1 ) ^ 0xA001 );
            else                             $crc =    $crc >> 1;
        }
    }

    return $crc;
}

This code works everytime, but I'm not exactly understanding what's going on.

  char *MakeCRC(char *BitString)
   {
  static char Res[17];                                 // CRC Result
  char CRC[16];
    int  i;
  char DoInvert;

   for (i=0; i<16; ++i)  CRC[i] = 0;                    // Init before calculation

   for (i=0; i<strlen(BitString); ++i)
    {
   DoInvert = ('1'==BitString[i]) ^ CRC[15];         // XOR required?

  CRC[15] = CRC[14];
  CRC[14] = CRC[13];
  CRC[13] = CRC[12];
  CRC[12] = CRC[11];
  CRC[11] = CRC[10];
  CRC[10] = CRC[9] ^ DoInvert;
  CRC[9] = CRC[8]; 
  CRC[8] = CRC[7] ^ DoInvert;
  CRC[7] = CRC[6] ^ DoInvert;
  CRC[6] = CRC[5];
  CRC[5] = CRC[4];
  CRC[4] = CRC[3];
  CRC[3] = CRC[2] ^ DoInvert;
  CRC[2] = CRC[1];
  CRC[1] = CRC[0];
  CRC[0] = DoInvert;
  }

  for (i=0; i<16; ++i)  Res[15-i] = CRC[i] ? '1' : '0'; // Convert binary to ASCII
  Res[16] = 0;                                         // Set string terminator

    return(Res);
    }


     // A simple test driver:

    #include <stdio.h>

   int main()
    {
    char *Data, *Result;                                       // Declare two strings

    Data = "1101000101000111";
    Result = MakeCRC(Data);                                    // Calculate CRC

    printf("CRC of [%s] is [%s] with P=[10000010110001001]\n", Data, Result);

     return(0);
      }

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在PHP中生成8位CRC(how to generate 8bit crc in php [duplicate])
    问题 这个问题已经在这里有了答案: 8年前关闭。 可能重复: CRC8-检查PHP 有没有好的PHP 8位CRC生成器? 我进行了搜索,但找不到任何好的来源。 我找到了一个16位的: function crc16($string) { $crc = 0xFFFF; for ($x = 0; $x < strlen ($string); $x++) { $crc = $crc ^ ord($string[$x]); for ($y = 0; $y < 8; $y++) { if (($crc & 0x0001) == 0x0001) { $crc = (($crc >> 1) ^ 0xA001); } else { $crc = $crc >> 1; } } } return $crc; } 回答1 我已经基于c中Mark的代码编写了一个简单的代码,并将其放在此处供任何人使用: global $crc8_table; $crc8_table = array( 0x00, 0x3e, 0x7c, 0x42, 0xf8, 0xc6, 0x84, 0xba, 0x95, 0xab, 0xe9, 0xd7, 0x6d, 0x53, 0x11, 0x2f, 0x4f, 0x71, 0x33, 0x0d, 0xb7, 0x89, 0xcb, 0xf5, 0xda, 0xe4, 0xa6
  • Make CRC on stm32 match with software implementation
    Upd. See the end of post for working code I'm already mad with this. How can I make checksum from CRC unit on stm32f103 match with software implementation? Stm has polynom 0x04C11DB7 and reset value 0xFFFFFFFF. So I've tried to calculate it in python. Code for stm: uint32_t crc32_hard_block(uint32_t *buf, uint32_t len) { CRC_ResetDR(); uint32_t crc = CRC_CalcBlockCRC(buf, len); return crc; } uint32_t buf[4] = {50, 10, 243, 147}; uint32_t crc_hard_block = crc32_hard_block(buf, 4); Code for python: custom_crc_table = {} def int_to_bytes(i): return [(i >> 24) & 0xFF, (i >> 16) & 0xFF, (i >> 8) &
  • C的确定性CRC(definitive CRC for C)
    问题 由于CRC的使用如此广泛,因此我很难在C中找到CRC实现感到惊讶。 是否有“所有人”使用的C的“确定的” CRC计算代码段/算法? 或者:有人可以担保并提出我一个好的CRC实施方案吗? 我特别在寻找CRC8和CRC16实现。 想到这一点,我的情况可能有点不合常规。 我正在为Linux编写C代码,并且该代码最终应移植到微控制器上。 似乎某些微控制器API确实与CRC实现一起提供。 无论如何,我都在寻找通用的软件实现(我读到CRC最初是由硬件实现的)。 回答1 不会。因为“ CRC”代表一组基于多项式的算法,所以没有“确定的CRC”。 通常会根据大小给出各种[模糊]通用名称(例如CRC-8,CRC-32)。 不幸的是,大多数尺寸都有几种不同的版本。 维基百科的“循环冗余校验”条目列出了一些常见的变体,但是必须使用给定域的正确校验和,否则会出现不兼容性。 (请参阅我对迈克答案的评论,以了解这有多令人困惑!) 无论如何,选择一个合适的实现并使用它-在网上可以找到很多示例。 如果碰巧有一个提供适当实现的库,则一定要使用它。 但是,没有为此的“标准” C库。 这里有一些资源: 在AutomationWiki上的“ CRC16”(CRC-16-CCITT)实现。 对Dobbs博士实施CCITT循环冗余检查。 Chris Borrelli撰写的IEEE 802
  • 如何计算CRC32校验和?(How is a CRC32 checksum calculated?)
    问题 也许我只是看不到它,但是CRC32似乎不必要地复杂,或者在我能在网上找到的任何地方都没有足够的解释。 我知道这是消息值的非基于进位算术除法的余数,再除以(生成器)多项式,但是它的实际实现使我无所适从。 我已经阅读了《 CRC错误检测算法的无痛指南》,我必须说这并非没有痛苦。 它在理论上讲得相当不错,但是作者从来没有想到一个简单的“就是这样”。 他确实说过标准CRC32算法的参数是什么,但他却忽略了清楚地说明如何获得它的方法。 让我感到高兴的部分是,当他说“这就是它”并接着说:“哦,顺便说一句,它可以被颠倒或以不同的初始条件开始”,而没有给出最终方法的明确答案。考虑到他刚刚添加的所有更改,计算CRC32校验和的过程。 关于CRC32的计算方式是否有更简单的解释? 我试图用C编写表的形成方式的代码: for (i = 0; i < 256; i++) { temp = i; for (j = 0; j < 8; j++) { if (temp & 1) { temp >>= 1; temp ^= 0xEDB88320; } else {temp >>= 1;} } testcrc[i] = temp; } 但这似乎产生了与我在互联网上其他地方发现的价值观不一致的价值观。 我可以使用在网上找到的值,但是我想了解它们是如何创建的。 在清理这些难以置信的混乱号任何帮助将是非常赞赏。
  • 如何从十六进制值计算 CRC-16?(How to calculate CRC-16 from HEX values?)
    问题 在我的代码中,我需要为存储为 NSdata 的十六进制值计算 CRC-16 16 位值,下面是在 c 中计算 CRC-16 的代码片段。 void UpdateCRC(unsigned short int *CRC, unsigned char x) { // This function uses the initial CRC value passed in the first // argument, then modifies it using the single character passed // as the second argument, according to a CRC-16 polynomial // Arguments: // CRC -- pointer to starting CRC value // x -- new character to be processed // Returns: // The function does not return any values, but updates the variable // pointed to by CRC static int const Poly = 0xA001; int i; bool flag; *CRC ^= x; for (i=0; i<8; i++) // CRC
  • CRC校验算法的Verilog实现
    一、 文章简述 CRC算法在通讯和数据传输领域中有着广泛的应用,关于CRC的原理本文档不做阐述,本文档将将重点放在Verilog CRC代码生成工具的使用和如何修改代码使其满足我们的要求两个方面来CRC算法Verilog实现的进行讲解。本教程包含以下方面的内容: 1.CRC类型简介 2.CRC参数简介 3.crc-gen代码生产工具的使用 4.CRC 校验代码的移植 5.CRC校验代码的测试 二、 CRC算法中参数的简介 2.1 CRC类型 简单来讲,CRC分为CRC-4、CRC-5、CRC-6、CRC-7、CRC-8、CRC-16、CRC-32;但是又可以进行更细节的分类,如图1所示,同样是CRC-8却有四种不同的计算方法,如CRC-8、CRC-8/ITU、CRC-8/ROHC、CRC-8/MAXIM。因此在进行CRC检验时,要根据实际情况进行选择,并且在双方进行通讯时,校验方式务必一致。 图1 CRC类型图 2.2 CRC参数: 从图1中可以看出,每一种CRC都有多个参数,这个参数用来确定检验算法具体如何实现,如图2所示。 图2 CRC参数图 CRC Name:CRC算法的名称,也是在CRC校验使用过程中很重要的参数,使用时通讯双方使用同一种检验方式进行检验、对比才有意义 CRC Width:CRC输出结果的位宽,与CRC名称中的-X相对应。 CRC Poly
  • 【CRC笔记】CRC-32 MPEG-2 C语言实现
    CRC笔记 CRC-32/MPEG-2 简介及C语言实现 一、CRC-32 MPEG-2算法简介二、CRC-32/MPEG-2算法基本信息三、CRC-32/MPEG-2算法的C语言实现1、查表法计算CRC-32/MPEG-22、直接计算法计算CRC-32/MPEG-23、测试程序 [参考资料] 一、CRC-32 MPEG-2算法简介 Class: attestedISO/IEC 13818-1:2000 — ITU-T Recommendation H.222.0 (February 2000) I Definition: Width, Poly, Init, RefIn, RefOut, Residue (Annex A, p.97)I CRC checking algorithm (Annex A, p.97)I Partial shift register diagram (Annex A, p.97) 二、CRC-32/MPEG-2算法基本信息 CRC算法名称CRC-32/MPEG-2多项式公式x32 + x26 + x23 +x22 + x16 + x12 +x11 + x10 + x8 +x7 + x5 + x4 + x2 + x +
  • How to calculate CRC-16 from HEX values?
    In my code i need to calculate CRC-16 16 bit values for the HEX values stored as NSdata, below is the code snippet to calculate CRC-16 in c. void UpdateCRC(unsigned short int *CRC, unsigned char x) { // This function uses the initial CRC value passed in the first // argument, then modifies it using the single character passed // as the second argument, according to a CRC-16 polynomial // Arguments: // CRC -- pointer to starting CRC value // x -- new character to be processed // Returns: // The function does not return any values, but updates the variable // pointed to by CRC static int const
  • 大部分静态数据流的CRC计算(CRC Calculation Of A Mostly Static Data Stream)
    问题 背景: 我有一段内存,1024字节。 最后的1020个字节将始终相同。 前4个字节将更改(产品的序列号)。 我需要为内存的整个部分CRC_WHOLE计算CRC-16 CCITT (起始值为0xFFFF,掩码为0x1021)。 问题: 是否可以仅计算前4个字节CRC_A的CRC,然后应用下面的函数来计算完整的CRC? 我们可以假定最后1020个字节的校验和CRC_B是已知的。 CRC_WHOLE = XOR(CRC_A, CRC_B) 我知道这个公式不起作用(尝试过),但是我希望存在类似的东西。 回答1 是的。 您可以在zlib的crc32_combine()看到。 如果您有两个序列A和B,则AB的纯CRC是A0的CRC与0B的CRC的异或,其中0表示一系列零字节,具有相应序列的长度,即B和A分别。 对于您的应用程序,您可以预先计算一个运算符,该运算符可以非常快速地将1020个零应用于前四个字节的CRC。 然后,您可以与1020字节的预计算CRC进行异或运算。 更新: 这是我的2008年发布的帖子,其中包含@ArtemB发现的详细解释(我忘记了): zlib中的crc32_combine()基于两个关键技巧。 对于以下内容,我们撇开了标准32位CRC进行预处理和后处理的事实。 我们可以稍后处理。 现在假定没有这种条件的CRC,因此从填充零的寄存器开始。 技巧1:CRC是线性的。
  • 如何获得 CRC64 分布式计算(使用其线性属性)?(How to get CRC64 distributed calculation (use its linearity property)?)
    问题 我需要散列存储在分布式 FS 上的相当大的文件。 我能够以比整个文件更好的性能处理文件的一部分,所以我希望能够计算部分的散列,然后对它进行求和。 我正在考虑将CRC64作为散列算法,但我不知道如何使用其理论上的“线性函数”属性,因此我可以对文件的各个部分进行 CRC 求和。 有什么推荐吗? 我在这里错过了什么? 附加说明为什么我要查看CRC64 : 我可以控制文件块,但由于应用程序性质,它们需要具有不同的大小(最多 1 个字节,不可能有任何固定块)。 我知道CRC32实现( zlib ),其中包括对各部分的 CRC 求和的方法,但我想要更广泛的东西。 8 字节对我来说看起来不错。 我知道CRC非常快。 我想从中获利,因为文件可能非常大(最多几 Gb)。 回答1 决定这通常足够有用,可以编写和提供: /* crc64.c -- compute CRC-64 * Copyright (C) 2013 Mark Adler * Version 1.4 16 Dec 2013 Mark Adler */ /* This software is provided 'as-is', without any express or implied warranty. In no event will the author be held liable for any damages
  • R函数“ poly”的真正作用是什么?(What does the R function `poly` really do?)
    问题 我已经阅读了手册页?poly (我承认我没有完全理解),还阅读了《统计学习入门》一书中对该功能的描述。 我目前的理解是,对poly(horsepower, 2)的调用应等效于编写horsepower + I(horsepower^2) 。 但是,这似乎与以下代码的输出相矛盾: library(ISLR) summary(lm(mpg~poly(horsepower,2), data=Auto))$coef # Estimate Std. Error t value Pr(>|t|) #(Intercept) 23.44592 0.2209163 106.13030 2.752212e-289 #poly(horsepower, 2)1 -120.13774 4.3739206 -27.46683 4.169400e-93 #poly(horsepower, 2)2 44.08953 4.3739206 10.08009 2.196340e-21 summary(lm(mpg~horsepower+I(horsepower^2), data=Auto))$coef # Estimate Std. Error t value Pr(>|t|) #(Intercept) 56.900099702 1.8004268063 31.60367 1.740911e-109
  • Java中多项式x^16 + x^12 + x^5 + 1计算CCITT标准CRC(Calculation of CCITT standard CRC with polynomial x^16 + x^12 + x^5 + 1 in Java)
    问题 我需要在 Java 中使用多项式 x^16 + x^12 + x^5 + 1 (0x1081) 计算 CCITT 标准 CRC 的帮助。 我在互联网上尝试了许多示例,但每个示例都返回示例中的值以外的其他值。 例如,对于这个数组 [0xFC] [05] [11],结果需要是 [27] [56]。 使用此代码: public static void main(String[] args) { byte[] array = new byte[3]; array[0] = (byte) 0xFC; array[1] = (byte) 0x05; array[2] = (byte) 0x11; // array[3] = (byte) 0x00; // array[4] = (byte) 0x00; System.out.println(Integer.toHexString(crc16(array))); } private static final int POLYNOMIAL = 0x1081; private static final int PRESET_VALUE = 0xFFFF; public static int crc16(byte[] data) { int current_crc_value = PRESET_VALUE; for (int i = 0; i <
  • 如何在PHP中计算crc16(How to calculate crc16 in php)
    问题 我需要将Ojective C编写的CRC代码转换为PHP的帮助。 以下是Objective C代码 static UInt16 CRC16_Table[] = { 0x0000, 0x2110, 0x4220, 0x6330, 0x8440, 0xa550, 0xc660, 0xe770, 0x0881, 0x2991, 0x4aa1, 0x6bb1, 0x8cc1, 0xadd1, 0xcee1, 0xeff1, 0x3112, 0x1002, 0x7332, 0x5222, 0xb552, 0x9442, 0xf772, 0xd662, 0x3993, 0x1883, 0x7bb3, 0x5aa3, 0xbdd3, 0x9cc3, 0xfff3, 0xdee3, 0x6224, 0x4334, 0x2004, 0x0114, 0xe664, 0xc774, 0xa444, 0x8554, 0x6aa5, 0x4bb5, 0x2885, 0x0995, 0xeee5, 0xcff5, 0xacc5, 0x8dd5, 0x5336, 0x7226, 0x1116, 0x3006, 0xd776, 0xf666, 0x9556, 0xb446, 0x5bb7, 0x7aa7, 0x1997, 0x3887, 0xdff7, 0xfee7, 0x9dd7, 0xbcc7
  • Arduino NRF24L01 应用实例
    Arduino(NANO) NRF24L01 应用实例 软件准备:microBox 库(https://github.com/wastel7/microBox):构建一个微型的命令行系统Mirf 库(https://github.com/E-elektronic/Mirf):提供RF相关的核心功能以上库请自行下载 硬件准备:Arduino NANO板 x 2; NRF24L01 x 2; Other; 开发环境:VS2017 + Arduino IDE(1.8.4) 硬件连接:Server、Client 与 NRF24L01模块的连接方式完全相同。接线次序:VCC:3.3V; GND:GND; CSN: 7; CE:8; MOSI:11; SCK:13; IRQ:不接; MISO:12; Client 代码(client.ino): #include "microBox.h" #pragma region UserDefined #define DEBUG //#undef DEBUG #ifndef FIRSWOF_ADD #define FIRSWOF_ADD #endif // !FIRSWOF_ADD #ifdef FIRSWOF_ADD /* * Hardware SPI: * MISO -> 12 * MOSI -> 11 * SCK -> 13 * *
  • BINEX格式介绍
    BINEX格式介绍 概述 BINEX是"BINary EXchange"的缩写,是常用的一种数据交换格式,在GNSS研究中用得很多。 BINEX被设计用来封装任意ASCII码形式的交换数据,比如 RINEX、IONEX、SP3、SINEX等。它有一些设计原则: 任意两个BINEX文件必须可以用cat命令连接生成一个新的合法的BINEX文件每个BINEX文件由一条或多条BINEX记录组成每条BINEX记录支持子记录每条记录中的数据有相同的存储顺序(big/little endian)BINEX解释器要能解析混合存储顺序的BINEX文件每条记录都有CRC校验若需要,BINEX文件可以从后往前读取BINEX记录中的时间标签必须在公元1980到3000年有效BINEX可扩展BINEX记录没有版本号 结构 BINEX包含两层结构,上层通用的记录结构,底层是具体的记录。 上层通用结构有两种。 结构一 字节数含义1同步字节,包含大小端控制位1 ~ 4记录ID1 ~ 4记录长度1 ~ 4(可选),位反转的记录长度 (只用于增强型CRC)n记录消息1 ~ 16CRC 结构二 字节数含义1同步字节,包含大小端控制位1 ~ 4记录ID1 ~ 4记录长度1 ~ 4(可选),位反转的记录长度 (只用于增强型CRC)n记录消息1 ~ 16CRC1 ~ 4反向字节数(字节反序)1反向同步字节,也包含大小端控制位
  • 在软件中实现SSE 4.2的CRC32C(Implementing SSE 4.2's CRC32C in software)
    问题 所以我设计了一个包含CRC32C校验和的设计,以确保数据没有被损坏。 我决定使用CRC32C,因为如果运行该软件的计算机支持SSE 4.2,则我可以同时拥有软件版本和硬件加速版本 我要阅读英特尔的开发人员手册(第2A卷),该手册似乎提供了crc32指令后面的算法。 但是,我运气不好。 英特尔开发人员指南说: BIT_REFLECT32: DEST[31-0] = SRC[0-31] MOD2: Remainder from Polynomial division modulus 2 TEMP1[31-0] <- BIT_REFLECT(SRC[31-0]) TEMP2[31-0] <- BIT_REFLECT(DEST[31-0]) TEMP3[63-0] <- TEMP1[31-0] << 32 TEMP4[63-0] <- TEMP2[31-0] << 32 TEMP5[63-0] <- TEMP3[63-0] XOR TEMP4[63-0] TEMP6[31-0] <- TEMP5[63-0] MOD2 0x11EDC6F41 DEST[31-0] <- BIT_REFLECT(TEMP6[31-0]) 现在,据我所知,我已经正确地完成了从TEMP6开始的TEMP6 ,但是我认为我可能是误解了多项式除法,或者是错误地实现了它。 如果我的理解是正确的,则1 / 1 mod
  • CRC通用计算类
    /*前段时间在做项目中用到了CRC循环校验,在网上查了很多资料,但是都很零乱;本人作了相关整理,并对常用的循环冗余校验进行了封装,形成本文件。在这里感谢网络上提供相关资料的朋友们,关于他们的名字在这里我无法一一列举,再次向他们表示感谢!*/ /*以下代码的计算思想适用于所有CRC校验算法。64位以上的由于ulong已经无法表示了,所以没有实现。但是思想也是一样的。不过64位以上可以使用.net里面的别的hash:比如md5等算法.主要参考地址:[url]http://www.wiki.cn/wiki/Cyclic_redundancy_check[/url][url]http://www.zorc.breitbandkatze.de/crc.html[/url] [url]http://www.zorc.breitbandkatze.de/crctester.c[/url]*/ /*需要注意的是:即使都是同样位数的crc校验,多项式也可以不同。即使多项式相同,初值,末值xor,是否反转等设置也可以不同所以在通信的双方需要约定好。以下的具体crc子类只是我能找到的一些常用的crc约定。哪位兄弟有具体的crc约定,可以告知我进行扩展。*/ //* 采用了泛型定义基类,基类是一个通用的计算CRC的方法,定义具体的类时只需要设置好CRC设置即可。//* 本来想用c#写模版代码,可是C
  • 使用verilog实现CRC校验
    我是桂林理工大三苦逼通信学子🐕。 在前些日子,学习计算机网络课程的时候,接触到了数据传输和以太网传输协议,并且还要去写一个以太网传输的作业,我当时是使用了c去解决这个问题。 其中在这个大作业中,CRC校验程序的编写,无疑是重中之重。碰巧,我这个假期自学了verilog,那就让我来试试可不可以用Verilog来写一段CRC校验吧。 什么是CRC? 循环冗余校验码简称CRC(循环码),是一种能力相当强的检错、纠错码,并且实现编码和检码的电路比较简单,常用于串行传送的辅助存储器与主机的数据通信和计算机网络中。 将要传送的信息M(X)表示为一个多项式L,用L除以一个预先确定的多项式G(X),得到的余式就是所需的循环冗余校验码。 CRC如何计算? 计算CRC,我们先要明确我们使用什么CRC算法,不同的CRC算法,会导致其参与计算的多项式公式不同。 例如常见的有:CRC-8:x8+x2+x+1; CRC-32: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1; 等等。 在此,我们以CRC-5/ITU为例子。CRC-5/ITU的多项式为x5+x4+x^2+1;转换为二进制,可得除数为110101; 其次,除了多项式的确定以外,我们还需要会模2算法
  • 在 R 数据帧中生成交互变量(Generating interaction variables in R dataframes)
    问题 有没有办法——除了 for 循环——在 R 数据帧中生成新变量,这将是现有变量之间所有可能的双向交互? 即假设一个具有三个数值变量 V1、V2、V3 的数据框,我想生成以下新变量: Inter.V1V2 (= V1 * V2) Inter.V1V3 (= V1 * V3) Inter.V2V3 (= V2 * V3) 使用 for 循环的示例: x <- read.table(textConnection(' V1 V2 V3 V4 1 9 25 18 2 5 20 10 3 4 30 12 4 4 34 16' ), header=TRUE) dim.init <- dim(x)[2] for (i in 1: (dim.init - 1) ) { for (j in (i + 1) : (dim.init) ) { x[dim(x)[2] + 1] <- x[i] * x[j] names(x)[dim(x)[2]] <- paste("Inter.V",i,"V",j,sep="") } } 回答1 如果您有以下因素,这里有一个适合您的衬垫: > model.matrix(~(V1+V2+V3+V4)^2,x) (Intercept) V1 V2 V3 V4 V1:V2 V1:V3 V1:V4 V2:V3 V2:V4 V3:V4 1 1 1 9 25 18 9 25
  • Calculation of CCITT standard CRC with polynomial x^16 + x^12 + x^5 + 1 in Java
    I need help with calculating of CCITT standard CRC with polynomial x^16 + x^12 + x^5 + 1 (0x1081) in Java. I have tried many examples on the internet but every one of them returns other values than the ones in the example. For example for this array [0xFC] [05] [11] the result needs to be [27] [56]. Using this code: public static void main(String[] args) { byte[] array = new byte[3]; array[0] = (byte) 0xFC; array[1] = (byte) 0x05; array[2] = (byte) 0x11; // array[3] = (byte) 0x00; // array[4] = (byte) 0x00; System.out.println(Integer.toHexString(crc16(array))); } private static final int