当前位置: 首页 > news >正文

串口通信(11)-CRC校验介绍算法

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!

> 发布人:@日月同辉,与我共生_单片机-CSDN博客

> 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。

系列专栏: CSDN-单片机串口通信学习系列🎁

> 我的格言是:“尽最大努力,做最好的自己!💪

要转载,请提前告知!!!

版权声明:本文为CSDN博主「日月同辉,与我共生」的原创文章,CSDN独一份。

目录

一、CRC效验简介

二、CRC应用广泛

三、校验优缺点

3.1优缺点-奇偶效验

3.2优缺点-异或效验

3.3优缺点-CRC效验

四、CRC效验

五、参考模型

六、crc算法

一、CRC效验简介

循环冗余校验码(CRC),是一种常用的、具有检错能力的校验码。循环冗余校验是指通过某种数学运算实现有效信息与校验位之间的循环校验。

这种编码基本思想是将要传送的信息M(X)表示为一个多项式L,用L除以一个预先确定的多项式G(X),得到的余式就是所需的循环冗余校验码。如果余数不为0,则说明数据在传输过程中出现了错误,相反,余数为0,说明数据在传输过程中未发生错误

二、CRC应用广泛

        CRC的应用非常广泛,包括但不限于以下领域:

        网络通信:在网络通信中,CRC被广泛用于检测数据传输过程中的错误。发送端将数据和              CRC一起发送给接收端,接收端通过计算CRC来检查数据是否在传输过程中被损坏。

        ⛄文件存储:在文件存储中,CRC可以用于检测文件的完整性。文件在传输或存储过程中可              能会被损坏,CRC可以帮助我们检测出这种错误。

        ⛄数据存储:在数据存储中,CRC可以用于检测数据的完整性。例如,在数据库中,CRC可              以用于检查存储的数据是否在存储过程中被更改。

        ⛄硬件设计:在硬件设计中,CRC被用于检测硬件故障。例如,在内存或CPU中,CRC可以              用于检测存储单元或逻辑单元是否存在问题。

        ⛄安全系统:CRC也被用于一些安全系统中,例如防火墙或入侵检测系统(IDS),以检测                异常流量或恶意攻击。

三、校验优缺点

3.1优缺点-奇偶效验

奇偶校验使用一个额外的二进制位(校验位)来确保数据中1的个数符合规定的奇偶性。例如,如果要求数据中1的个数为奇数,那么当数据中1的个数为偶数时,需要在数据的末尾添加一个1,使得总共有奇数个1。同样地,如果要求数据中1的个数为偶数,那么当数据中1的个数为奇数时,需要在数据的末尾添加一个0,使得总共有偶数个1。

奇偶校验的优点是简单易实现,适用于检测单个位的错误。但是,它无法检测出多位错误,并且如果传输中出现两位以上的错误,则无法检测出错误。此外,奇偶校验需要额外的带宽来传输校验位,对传输效率有一定影响。

3.2优缺点-异或效验

异或校验利用了异或运算的性质,即当两个操作数的对应位相同时,结果为0;当两个操作数的对应位不同时,结果为1。因此,通过对数据的每个比特位进行异或运算,可以得到一个校验码。在接收端,将接收到的数据再次进行异或运算,如果结果为0,则说明数据没有被篡改;否则,说明数据可能被篡改。

它的优点是简单快速、无需额外的冗余位和带宽,但缺点是只能检测到奇数位的错误

3.3优缺点-CRC效验

CRC效验是一种广泛应用的数据校验方法,具有检测错误能力强、适用于多种数据类型和传输方式、校验效率高等优点。然而,CRC也存在一些缺点,如计算复杂度高、需要添加冗余位、在出现多个错误时可能无法检测出所有错误等。

四、CRC效验

思路步骤:

1.把生成多项式转换成二进制数。例如,对于多项式G(X)=X4+X3+1,它一共是5位(最高位的幂次为4,加1得到5),根据多项式各项的含义,可以得到它的二进制比特串为11001。

2.根据CRC校验码的位数和生成多项式的关系,得出CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。

3.初始化CRC校验码的值为0,并将其添加到信息后面

4.依据“模2除法”计算CRC校验码。每次计算都是消除高次项,然后移入新的数据,再进行下一次计算,直到所有的数据计算完成。

5.将计算出的余数替代CRC校验码初始值,得到CRC校验码。

6.最终得到的CRC校验码就是数据在传输过程中需要携带的校验信息

模2除法是一种在二进制下进行除法的计算方法,其特点是在每一位的除法结果不影响其他位,即不向上一位借位,实际上就是异或。可以看下列例子↓ ↓ ↓

例子:

假设我们有一个数据帧(data frame)为1011001,并且我们选择的生成多项式(generator polynomial)为X^5+X^4+1(对应的二进制数为11001)。

因为CRC校验码的位数比生成多项式的位数(6位,总位数=最高次幂+1)少1,所以CRC校验码的位数为5。

(1)初始化CRC校验码为全0,即00000。

(2)将数据帧与CRC校验码拼接起来,得到新的数据序列:101100100000。

(3)把101100100000以“模2除法”除于生成多项式11001计算。

(4)将结果01101代替101100100000后面的五位“00000”,将新帧101100101101发送到接收端。

(5)新帧被接收端接收后,接收端把新帧再用生成多项式11001以“模2除法”方式去除,验证余数是否为0。如果结果为0,则说明数据没有被篡改;否则,说明数据可能被篡改。

五、参考模型

CRC参考模型:

CRC算法名称多项式公式宽度多项式初始值结果异或值输入值反转输出值反转
CRC-4/ITUx4 + x + 14030000truetrue
CRC-5/EPCx4 + x3 + 15090900falsefalse
CRC-5/ITUx5 + x4 + x2 + 15150000truetrue
CRC-5/USBx5 + x2 + 15051F1Ftruetrue
CRC-6/ITUx6 + x + 16030000truetrue
CRC-7/MMCx7 + x3 + 17090000falsefalse
CRC-8x8 + x2 + x + 18070000falsefalse
CRC-8/ITUx8 + x2 + x + 18070055falsefalse
CRC-8/ROHCx8 + x2 + x + 1807FF00truetrue
CRC-8/MAXIMx8 + x5 + x4 + 18310000truetrue
CRC-16/IBMx16 + x15 + x2 + 116800500000000truetrue
CRC-16/MAXIMx16 + x15 + x2 + 11680050000FFFFtruetrue
CRC-16/USBx16 + x15 + x2 + 1168005FFFFFFFFtruetrue
CRC-16/MODBUSx16 + x15 + x2 + 1168005FFFF0000truetrue
CRC-16/CCITTx16 + x12 + x5 + 116102100000000truetrue
CRC-16/CCITT-FALSEx16 + x12 + x5 + 1161021FFFF0000falsefalse
CRC-16/x5x16 + x12 + x5 + 1161021FFFFFFFFtruetrue
CRC-16/XMODEMx16 + x12 + x5 + 116102100000000falsefalse
CRC-16/DNPx16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1163D650000FFFFtruetrue
CRC-32x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 +
x7 + x5 + x4 + x2 + x + 1
3204C11DB7FFFFFFFFFFFFFFFFtruetrue
CRC-32/BZIP2x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 +
x7 + x5 + x4 + x2 + x + 1
3204C11DB7FFFFFFFFFFFFFFFFfalsefalse
CRC-32/MPEG-2x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 +
x7 + x5 + x4 + x2 + x + 1
3204C11DB7FFFFFFFF00000000falsefalse

六、crc算法

MODBUS通讯协议CRC16校验代码(读者可自行引用)

CRC算法名称多项式公式宽度多项式初始值结果异或值输入值反转输出值反转
CRC-16/MODBUSx16 + x15 + x2 + 1168005FFFF0000truetrue
 /***********************CRC校验*************************/// CRC 高位字节值表
unsigned char code auchCRCHi[260] = { 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 
} ; 
// CRC低位字节值表
unsigned char code  auchCRCLo[260] = { 
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 
0x43, 0x83, 0x41, 0x81, 0x80, 0x40 
} ;
unsigned int crc16(unsigned char *puchMsg, unsigned int usDataLen) 
{ unsigned char uchCRCHi = 0xFF ;   //*高CRC字节初始化 unsigned char uchCRCLo = 0xFF ;   //*低CRC字节初始化  unsigned long uIndex ;            // CRC循环中的索引 while (usDataLen--)               //传输消息缓冲区 { uIndex = uchCRCHi ^ *puchMsg++ ; // 计算CRC  uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; uchCRCLo = auchCRCLo[uIndex] ; } return (uchCRCHi << 8 | uchCRCLo);
}STM系列/***********************CRC校验*************************/// CRC 高位字节值表
static const U8 auchCRCHi[260] = { 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 
} ; 
// CRC低位字节值表
static const U8 auchCRCLo[260] = { 
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 
0x43, 0x83, 0x41, 0x81, 0x80, 0x40 
} ;
U16 crc16(U8 *puchMsg, U16 usDataLen) 
{ U8 uchCRCHi = 0xFF ;               //*高CRC字节初始化 U8 char uchCRCLo = 0xFF ;          //*低CRC字节初始化  U32 uIndex ;                       // CRC循环中的索引 while (usDataLen--)               //传输消息缓冲区 { uIndex = uchCRCHi ^ *puchMsg++ ; // 计算CRC  uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex]; uchCRCLo = auchCRCLo[uIndex] ; } return (U16)(uchCRCHi << 8 | uchCRCLo);
}

亲爱的读者敬请期待,下一文更精彩!!!

一日不读书,胸臆无佳想。我叫不白吃,喜欢我的,可以支持我,博主名叫 @日月同辉,与我共生icon-default.png?t=N7T8https://blog.csdn.net/LIN___IT?type=blog

相关文章:

  • 第 117 场 LeetCode 双周赛题解
  • webpack打包时使用import引入element,element地址信息不会被打包到budle中而axios就会呢?
  • Python爬取股票交易数据代码示例及可视化展示。
  • CSS 属性学习笔记(入门)
  • Mybatis-Plus条件构造器QueryWrapper
  • 2023年云计算发展趋势浅析
  • 招投标系统软件源码,招投标全流程在线化管理
  • 除了Excel中可以添加公式之外,在Word中也可以添加公式,不过都是基于表格
  • 做一个Springboot文件上传-阿里云
  • ubuntu18.04配置Java环境与安装RCS库
  • 2. 深度学习——初始化方法
  • arcgis--NoData数据处理
  • 深入理解 TCP;场景复现,掌握鲜为人知的细节
  • 7 款最好的 Android 手机数据恢复软件榜单(持续更新列表)
  • 漏电继电器 LLJ-250HT AC220V 50-500ma 面板安装
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【翻译】babel对TC39装饰器草案的实现
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • docker python 配置
  • docker-consul
  • echarts的各种常用效果展示
  • Facebook AccountKit 接入的坑点
  • input实现文字超出省略号功能
  • Invalidate和postInvalidate的区别
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java比较器对数组,集合排序
  • Java超时控制的实现
  • Nacos系列:Nacos的Java SDK使用
  • passportjs 源码分析
  • PAT A1092
  • tensorflow学习笔记3——MNIST应用篇
  • ubuntu 下nginx安装 并支持https协议
  • Web Storage相关
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 简析gRPC client 连接管理
  • 你不可错过的前端面试题(一)
  • 用quicker-worker.js轻松跑一个大数据遍历
  • Java总结 - String - 这篇请使劲喷我
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​如何在iOS手机上查看应用日志
  • #100天计划# 2013年9月29日
  • #define 用法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .gitignore文件---让git自动忽略指定文件
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net 流——流的类型体系简单介绍
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献