CRC校验原理及其使用

article/2025/7/9 3:10:21

目录

何为CRC

为什么需要校验

为什么是CRC

CRC的缺点

目录

何为CRC

为什么需要校验

为什么是CRC

CRC的缺点

如何进行CRC校验

校验标准式是什么玩意?

常见的CRC校验

CRC校验计算过程

CRC校验代码参考

代码解读

生成CRC8校验表的代码

CRC检验网站


如何进行CRC校验

校验标准式是什么玩意?

常见的CRC校验

生成CRC校验的代码


何为CRC

CRC,循环冗余校验码,本质就是一个校验码,用于检测通讯数据是否正确。常见的还有奇偶校验,校验和(所有数据相加)、LRC校验、异或校验、MD5校验等。

为什么需要校验

数据传输过程中,由于其他干扰的存在,有概率会出现数据传输错误的现象。为了识别接收的数据是否正确,我们需要在数据传输完成后增加一个校验数据,接收端按照校验规则计算出(所接收数据的)校验码,与发送端的校验码进行对比,两个校验码不相等说明数据传输出错,反之,通讯正确。

为什么是CRC

数据校验本身没有优略之分,CRC可以很大程度上识别出数据传输。举个不恰当的例子,奇偶校验可能识别出百分之五十的数据传输错误,CRC可能可以识别到百分之九十;检测的成本也比较低(占用的资源相对少),从性价比上来看,CRC是个很好的校验法。

CRC的缺点

循环冗余校验法检验不出来的错的情况:收到的位串虽然是错误的,但是恰巧能被生成多项式整除,这个时候检测不出来

如何进行CRC校验

在了解了CRC是什么之后,还需要了解怎么做。

CRC校验的逻辑是将需要校验的数据与校验标准式进行异或运算,也就是模2除法。不懂什么叫模2除法根本没关系,只要理解什么叫异或运算就可以了。

校验标准式是什么玩意?

本质就是一个用于异或的值。这个东西的存在的意义就是规范接收端与发送端的异或值。理论上,式子越复杂,通讯错误的识别率就越高。下面的表格就是常见的CRC校验标准式,摘自链接

 有没有被标准式的复杂给震慑住?不用怕,它们就是纸老虎,看懂后,你会发现它们连纸老虎都不如。

式子中x的次方只是标位数,后面的计算根本就不需要考虑。

比如  x^{4}+x^{1}+1  对应的异或值就是 0001 0011 也就是0x13

x^{4}是第四位,x^{1}是第一位,1就是第零位(x^{0

再看一个

x^{5}+x^{3}+1,对应的异或值就是 0010 1001 也就是0x29

x^{5}是第五位,x^{3}是第三位,1就是第零位(x^{0

看了几个例子清楚怎么找异或值了吧,这个标准式就是为了得到异或值,没有其他的用处了,是不是很简单。

还要注意的一点就是,需要根据CRC校验位数对异或值进行取低位,舍高位。

比如 x^{8}+x^{5}+x^{4}+1  ,对应的异或值是1 0011 0001,也就是0x131,但我们用的是CRC8的话,只需要取低八位,也就是0x31就行;

常见的CRC校验

常见的CRC校验有CRC8,CRC16,CRC32,其中CRC8与CRC16用于通讯在嵌入式行业比较常用。

目前我就掌握了CRC8的使用,我看到CRC16,CRC32是只取低8位进行计算,原理上可能也差不多吧。

CRC校验计算过程

摘自计算过程

计算过程就是进行异或运算,首先先对数据进行补0处理(CRC8就补8位),然后进行异或计算。计算过程了解一下就行,写程序又不用你来手算,了解原理就好。

CRC校验代码参考

代码取自 原代码地址

#include "crcLib.h"/******************************************************************************* Name:    CRC-4/ITU           x4+x+1* Poly:    0x03* Init:    0x00* Refin:   True* Refout:  True* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc4_itu(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;                // Initial valuewhile(length--){crc ^= *data++;                 // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x0C;// 0x0C = (reverse 0x03)>>(8-4)elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-5/EPC           x5+x3+1* Poly:    0x09* Init:    0x09* Refin:   False* Refout:  False* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc5_epc(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0x48;        // Initial value: 0x48 = 0x09<<(8-5)while(length--){crc ^= *data++;        // crc ^= *data; data++;for ( i = 0; i < 8; i++ ){if ( crc & 0x80 )crc = (crc << 1) ^ 0x48;        // 0x48 = 0x09<<(8-5)elsecrc <<= 1;}}return crc >> 3;
}/******************************************************************************* Name:    CRC-5/ITU           x5+x4+x2+1* Poly:    0x15* Init:    0x00* Refin:   True* Refout:  True* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc5_itu(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;                // Initial valuewhile(length--){crc ^= *data++;                 // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x15;// 0x15 = (reverse 0x15)>>(8-5)elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-5/USB           x5+x2+1* Poly:    0x05* Init:    0x1F* Refin:   True* Refout:  True* Xorout:  0x1F* Note:*****************************************************************************/
uint8_t crc5_usb(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0x1F;                // Initial valuewhile(length--){crc ^= *data++;                 // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x14;// 0x14 = (reverse 0x05)>>(8-5)elsecrc = (crc >> 1);}}return crc ^ 0x1F;
}/******************************************************************************* Name:    CRC-6/ITU           x6+x+1* Poly:    0x03* Init:    0x00* Refin:   True* Refout:  True* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc6_itu(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;         // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x30;// 0x30 = (reverse 0x03)>>(8-6)elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-7/MMC           x7+x3+1* Poly:    0x09* Init:    0x00* Refin:   False* Refout:  False* Xorout:  0x00* Use:     MultiMediaCard,SD,ect.*****************************************************************************/
uint8_t crc7_mmc(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for ( i = 0; i < 8; i++ ){if ( crc & 0x80 )crc = (crc << 1) ^ 0x12;        // 0x12 = 0x09<<(8-7)elsecrc <<= 1;}}return crc >> 1;
}/******************************************************************************* Name:    CRC-8               x8+x2+x+1* Poly:    0x07* Init:    0x00* Refin:   False* Refout:  False* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc8(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for ( i = 0; i < 8; i++ ){if ( crc & 0x80 )crc = (crc << 1) ^ 0x07;elsecrc <<= 1;}}return crc;
}/******************************************************************************* Name:    CRC-8/ITU           x8+x2+x+1* Poly:    0x07* Init:    0x00* Refin:   False* Refout:  False* Xorout:  0x55* Alias:   CRC-8/ATM*****************************************************************************/
uint8_t crc8_itu(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for ( i = 0; i < 8; i++ ){if ( crc & 0x80 )crc = (crc << 1) ^ 0x07;elsecrc <<= 1;}}return crc ^ 0x55;
}/******************************************************************************* Name:    CRC-8/ROHC          x8+x2+x+1* Poly:    0x07* Init:    0xFF* Refin:   True* Refout:  True* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc8_rohc(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0xFF;         // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xE0;        // 0xE0 = reverse 0x07elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-8/MAXIM         x8+x5+x4+1* Poly:    0x31* Init:    0x00* Refin:   True* Refout:  True* Xorout:  0x00* Alias:   DOW-CRC,CRC-8/IBUTTON* Use:     Maxim(Dallas)'s some devices,e.g. DS18B20*****************************************************************************/
uint8_t crc8_maxim(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;         // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; i++){if (crc & 1)crc = (crc >> 1) ^ 0x8C;        // 0x8C = reverse 0x31elsecrc >>= 1;}}return crc;
}/******************************************************************************* Name:    CRC-16/IBM          x16+x15+x2+1* Poly:    0x8005* Init:    0x0000* Refin:   True* Refout:  True* Xorout:  0x0000* Alias:   CRC-16,CRC-16/ARC,CRC-16/LHA*****************************************************************************/
uint16_t crc16_ibm(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-16/MAXIM        x16+x15+x2+1* Poly:    0x8005* Init:    0x0000* Refin:   True* Refout:  True* Xorout:  0xFFFF* Note:*****************************************************************************/
uint16_t crc16_maxim(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return ~crc;    // crc^0xffff
}/******************************************************************************* Name:    CRC-16/USB          x16+x15+x2+1* Poly:    0x8005* Init:    0xFFFF* Refin:   True* Refout:  True* Xorout:  0xFFFF* Note:*****************************************************************************/
uint16_t crc16_usb(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return ~crc;    // crc^0xffff
}/******************************************************************************* Name:    CRC-16/MODBUS       x16+x15+x2+1* Poly:    0x8005* Init:    0xFFFF* Refin:   True* Refout:  True* Xorout:  0x0000* Note:*****************************************************************************/
uint16_t crc16_modbus(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-16/CCITT        x16+x12+x5+1* Poly:    0x1021* Init:    0x0000* Refin:   True* Refout:  True* Xorout:  0x0000* Alias:   CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT*****************************************************************************/
uint16_t crc16_ccitt(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x8408;        // 0x8408 = reverse 0x1021elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-16/CCITT-FALSE   x16+x12+x5+1* Poly:    0x1021* Init:    0xFFFF* Refin:   False* Refout:  False* Xorout:  0x0000* Note:*****************************************************************************/
uint16_t crc16_ccitt_false(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        //Initial valuewhile(length--){crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint6_t)(*data)<<8; data++;for (i = 0; i < 8; ++i){if ( crc & 0x8000 )crc = (crc << 1) ^ 0x1021;elsecrc <<= 1;}}return crc;
}/******************************************************************************* Name:    CRC-16/X25          x16+x12+x5+1* Poly:    0x1021* Init:    0xFFFF* Refin:   True* Refout:  True* Xorout:  0XFFFF* Note:*****************************************************************************/
uint16_t crc16_x25(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x8408;        // 0x8408 = reverse 0x1021elsecrc = (crc >> 1);}}return ~crc;                // crc^Xorout
}/******************************************************************************* Name:    CRC-16/XMODEM       x16+x12+x5+1* Poly:    0x1021* Init:    0x0000* Refin:   False* Refout:  False* Xorout:  0x0000* Alias:   CRC-16/ZMODEM,CRC-16/ACORN*****************************************************************************/
uint16_t crc16_xmodem(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;            // Initial valuewhile(length--){crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++;for (i = 0; i < 8; ++i){if ( crc & 0x8000 )crc = (crc << 1) ^ 0x1021;elsecrc <<= 1;}}return crc;
}/******************************************************************************* Name:    CRC-16/DNP          x16+x13+x12+x11+x10+x8+x6+x5+x2+1* Poly:    0x3D65* Init:    0x0000* Refin:   True* Refout:  True* Xorout:  0xFFFF* Use:     M-Bus,ect.*****************************************************************************/
uint16_t crc16_dnp(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;            // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA6BC;        // 0xA6BC = reverse 0x3D65elsecrc = (crc >> 1);}}return ~crc;                // crc^Xorout
}/******************************************************************************* Name:    CRC-32  x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1* Poly:    0x4C11DB7* Init:    0xFFFFFFF* Refin:   True* Refout:  True* Xorout:  0xFFFFFFF* Alias:   CRC_32/ADCCP* Use:     WinRAR,ect.*****************************************************************************/
uint32_t crc32(uint8_t *data, uint16_t length)
{uint8_t i;uint32_t crc = 0xffffffff;        // Initial valuewhile(length--){crc ^= *data++;                // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xEDB88320;// 0xEDB88320= reverse 0x04C11DB7elsecrc = (crc >> 1);}}return ~crc;
}/******************************************************************************* Name:    CRC-32/MPEG-2  x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1* Poly:    0x4C11DB7* Init:    0xFFFFFFF* Refin:   False* Refout:  False* Xorout:  0x0000000* Note:*****************************************************************************/
uint32_t crc32_mpeg_2(uint8_t *data, uint16_t length)
{uint8_t i;uint32_t crc = 0xffffffff;  // Initial valuewhile(length--){crc ^= (uint32_t)(*data++) << 24;// crc ^=(uint32_t)(*data)<<24; data++;for (i = 0; i < 8; ++i){if ( crc & 0x80000000 )crc = (crc << 1) ^ 0x04C11DB7;elsecrc <<= 1;}}return crc;
}

代码解读

代码其实没什么难度,计算需要三个变量,异或值,异或初始值,数组(包含了数组名+长度),两个循环(字符串循环,位循环)。异或值与异或初始值由选取的协议确定,数组就是要进行校验的数据。

 crc ^= *data++; //是先取*data[0]进行异或,运行完后才*data+1;

生成CRC8校验表的代码

取自生成CRC8校验表

//到https://c.runoob.com/compile/11/中生成
//或者 http://c.jsrun.net/
#include <stdio.h>/* 本地调用此函数计算出所有 CRC-8 校验码 */
//正序
unsigned char Cal_CRC8(const unsigned char data)
{unsigned char i, crc;crc = data;/* 数据往左移了8位,需要计算8次 */for (i = 8; i > 0; i--) {/* 判断最高位是否为1 */if(crc & 0x80) {/* 最高位为1,不需要异或,往左移一位,然后与0x2f异或 *//* 0x12f(多项式:x8 + x5 + x3 + x2 + x + 1,  100101111),最高位不需要异或,直接去掉 *///按照实际情况,更改这个部分crc = (crc << 1) ^ 0x2f;} else {/* 最高位为0时,不需要异或,整体数据往左移一位 */crc = (crc << 1);}}return crc;
}//需要反序的就调用这个函数
unsigned char cal_table_low_first(unsigned char value)
{unsigned char i, crc;crc = value;
/* 同样需要计算8次 */for (i=8; i>0; --i){ if (crc & 0x01)  /* 反序异或变成判断最低位是否为1 *//* 数据变成往右移位了 *//* 计算的多项式从0x31(0011 0001)变成了0x8C (1000 1100) */
/* 多项式值,原来的最高位变成了最低位,原来的最低位变成最高位,8位数据高低位交换一下位置 */crc = (crc >> 1) ^ 0x8C;elsecrc = (crc >> 1);}return crc;
}int main()
{unsigned char j = 0;int count = 1;for(unsigned int i = 0; i < 256; i++) {j = Cal_CRC8(i);if(count %  16) {count++;printf("0x%x, ", j);} else {count++;printf("0x%x,\n", j);}}return 0;
}

CRC检验网站

IP33.COM

使用这个网站的时候需要注意一下是正序和反序。

 就先这样吧,有发现不正确的地方,还望指出改正


http://chatgpt.dhexx.cn/article/f5pu0krv.shtml

相关文章

FPGA校验(2):CRC校验

CRC:输入序列对某个表达式求余数&#xff0c;或者认为一系列数据求异或的过程。 CRC校验 CRC原理 CRC实现非常简单&#xff0c;但想要真正掌握CRC算法原理&#xff0c;就必须清楚地了解有限域的运算规则&#xff0c;知道CRC就是有限域中的除法余数&#xff0c;并且清楚如何将串…

crc校验c语言程序,C语言:CRC校验

一、CRC码 CRC:Cylic Reduancy check译作汉语就是循环冗余校验码。 二、XOR XOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。 三、用XOR代替算术运算上除法的两个例子。 1、10110010000/11001 第一次异或(相除),得到商为1,余数为1111,加入…

【Verilog】CRC 校验(二)用 Verilog 实现生成 CRC 校验码

目录 实验任务 CRC 生成 Verilog 实现 电路生成原理 模块设计图 CRC 生成时序图 具体代码实现 上板验证 实验任务 在上一篇介绍了 CRC 校验码的原理&#xff0c;如何计算 CRC 校验码&#xff0c;这篇介绍如何利用 Verilog 实现CRC 校验码的生成。 什么是 CRC 校验码&a…

CRC校验 - 基于FPGA的实现

CRC校验 - 基于FPGA的实现 0 背景 CRC即循环冗余校验&#xff1a;常用于数据通信领域中&#xff0c;通常由发送端添加校验码于单帧数据的尾部&#xff0c;并由接受方进行提取和校验该帧数据传输是否正确。 循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&am…

CRC校验的原理及实现方法

一、CRC校验介绍 循环冗余校验码&#xff08;CRC&#xff09;&#xff0c;是一种常用的、具有检错、纠错能力的校验码&#xff0c;在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。循环冗余校验是通过某种数学运算来建立数据位和校验位的约定…

C#编程,CRC校验原理

1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check&#xff0c; CRC)&#xff0c;是通信领域数据传输技术中常用的检错方法&#xff0c;用于保证数据传输的可靠性。网上有关这方面的博客和资料很多&#xff0c;本文尽量简洁的梳理一下它的原理。后面还会结合自己的实践经…

LabVIEW实现CRC校验

目录 1、内部控件计算CRC校验 2、公式节点计算CRC校验 CRC&#xff08;循环冗余校验&#xff09;&#xff0c;是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术&#xff0c;主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除…

CRC校验及C语言实现

摘自&#xff1a;CRC校验原理及其C语言实现 地址&#xff1a;https://blog.csdn.net/whik1194/article/details/108837493?spm1001.2014.3001.5502 目录 什么是校验算法CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结 什么是校验算法 最近的工作中&…

SwitchHosts

SwitchHosts 官网&#xff1a;https://oldj.github.io/SwitchHosts/ 客户端支持 WindowsLinuxMac 功能支持 快速切换Hosts在线 hosts 方案Chrome浏览器Hosts实时生效 v3.3.12后将被支持&#xff0c;可暂时下载 https://github.com/CloverNet/SwitchHosts

Host服务

这也是看网上的例子自己跟着配置做的一个小demo&#xff0c;这里记录一下。 一、创建一个空的控制台应用程序 二、安装所需dll  1.Quartz     Install-Package Quartz -Version 2.3.3  2.Owin    Install-Package Owin -Version 1.0.0&#xff08;这个暂时装上&…

Go get http 服务

阅读目录 package mainimport ("encoding/json""fmt""net/http" )type MirageIPResponse struct {Code string json:"code"MirageIP string json:"MirageIp" }func main() {// 定义处理函数handler : func(w http.Respo…

google host地址

2019独角兽企业重金招聘Python工程师标准>>> http://git.oschina.net/AlexKing/host 保持更新中。。。 亲测通过&#xff0c;如果无法使用可以联系我&#xff0c;再做更新调整。 转载于:https://my.oschina.net/u/260921/blog/506286

virtio,vhost 和vhost-user

virtio 在虚拟机中&#xff0c;可以通过qemu模拟e1000网卡&#xff0c;这样的经典网卡一般各种客户操作系统都会提供inbox驱动&#xff0c;所以从兼容性上来看&#xff0c;使用类似e1000的模拟网卡是非常一个不错的选择。 但是&#xff0c;e1000网卡上也包含了复杂的io端口&a…

GO的服务

1.go的安装 1.1 确认版本go version go version go1.20.4 darwin/amd64 可以看到是macos10.14版本。如果是m1 需要安装对应的版本 1.2 用vscode 进行编写go的简单例子 先进入vscode的界面&#xff0c;新建一个目录为godemo&#xff0c;里面就是go的例子的工作目录&#xff0…

Go Registry

实现微服务的服务注册中心&#xff0c;支持服务服务注册、接收心跳等。客户端实现基于注册中心的服务发现机制 微服务 微服务是一些协同工作的小而自治的服务 微服务主要分为六个部分组成 服务描述&#xff1a;类似服务的文档说明&#xff0c;简单但不可或缺。 比如&#xff1a…

Gogs私服搭建

1. Gogs介绍 官网地址&#xff1a;https://gogs.io 文档地址&#xff1a;https://gogs.io/docs Gogs&#xff0c;全称为Go Git Service&#xff0c;是一个基于 Go 语言开发的Git服务。它提供了一个类似于GitHub的界面和功能&#xff0c;允许您在自己的服务器上搭建私有的Git仓库…

vhost-user

1&#xff0c;virtqueue 图一 每个queue实际上是由tx/rx两个virtqueue组成的也就是说tx和rx的virtqueue是分开的&#xff0c;并没有共享。一个virtio net设备最多有多少个queue由后端vhost决定&#xff0c;但前端可以通过ethtool –L eth0 combined 16命令动态修改当前队列数&…

gohost -- go 开发的命令行hosts配置管理工具

前几天在微博上看到有人推荐了lazygit这个工具&#xff0c;让人眼前一亮&#xff0c;什么时候命令行也可以这么抢到了&#xff0c;?&#xff0c;调研了下&#xff0c;发现它使用了gocui&#xff0c;使用它可以做出来很多很炫的命令行工具。 现有的hosts工具里面也有switchosts…

Android studio占用C盘资源的解决方法

Android studio占用C盘资源的解决方法 Android Studio安装成功后会在系统盘用户目录下产生这几个文件夹 一、目录介绍 1、.android 是Android SDK生成的AVD&#xff08;Android Virtual Device Manager&#xff09;即模拟器存放路径 2、.AndroidStudio4.0&#xff08;这里我安…

Minecraft神奇玩家不用键盘,行走全部靠骑猪最后通关MC

大家好&#xff0c;在Minecraft中有非常多的玩法&#xff0c;但是您听说过全程游戏不用键盘只用鼠标通关的玩法吗&#xff1f;也就是说在游戏中不能使用WSAD和空格按键通关&#xff01;这听起来简直就是天方夜谈了&#xff01; 在国外有位玩家叫做HeightAdvantage的玩家&#…