带你人工识别C#开源库BarcodeLib生成的一维码Code128
我们是做HIS系统开发的,前段时间发现某些处方的一维码出现无法识别的情况。看了一下一维码生成的逻辑,使用到了BarcodeLib库,经过反复确认,我们程序是没有问题的。后面不得不反编译看一下BarcodeLib生成一维码的逻辑。最后调整一维码的宽度解决了问题。而且发现它的编码和通信领域的编码思想有神奇的相似之处。编码格式类型:开始位+数据位+检查校验位+STOP停止位+11。总的来说是解密和编码都是查表法,如要把数字69进行编码,通过查表可以知道编码的结果为:10110010000。 解密就是逆过程,如知道编码为10110010000,通过查表,也可以知道编码前的数字为69
这里简单介绍一下BarcodeLib库Code128一维码的编码过程:
1 先把数字如:6986081进行编码,两个数字作为一组进行编码,这里数字69一组,86一组,08一组,剩下一个1就比较特别,源码看得不是很懂,有特殊的规则进行编码
2 把两位数字通过查表法进行编码,编码为11位的0或1数字。如数字69编码为10110010000
3 通过C#的绘图类Graphics的画线方法.DrawLine进行绘制线,如要绘制10110010000编码,碰到1就纵向绘制一定宽度的直线,碰到0就不绘制直线。
下面我们一起来分析一下这个一维码:
先告知一下这个一维码的值为:6986081
通过上图的分析,上图的编码可以编码为:
1101001110010110010000111101001001000110010011101011110
10011100110100010001101100011101011
按照11位进行分组整理后如下:
11010011100
10110010000
11110100100
10001100100
11101011110
10011100110
10001000110
11000111010
11
通过编码11010011100查找本文后面的编码表得到的数值为START_C
通过编码10110010000查找本文后面的编码表得到的数值为69
通过编码10001100100查找本文后面的编码表得到的数值为08
通过编码11101011110查找本文后面的编码表得到的数值为CODE_A
通过编码10011100110 查找本文后面的编码表得到的数值为17,但前面有一个CODE_A,应该编码为1
通过编码10001000110查找本文后面的编码表得到的数值为C,则为检查校验位
通过编码11000111010查找本文后面的编码表得到的数值为STOP,则为停止位
最后两位11应该也是校验位吧。
最后汇总如下:
11010011100 START_C 开始
10110010000 69
11110100100 86
10001100100 08
11101011110 CODE_A
10011100110 这个是编1而不是17
10001000110 检查校验位
11000111010 STOP停止位
11
最后一维码的解码结果为:6986081
补充说明:
BarcodeLib库Code128编码表如下,偷懒一点,就直接贴源码了
private void init_Code128()
{this.C128_Code.CaseSensitive = true;this.C128_Code.Columns.Add("Value", typeof(string));this.C128_Code.Columns.Add("A", typeof(string));this.C128_Code.Columns.Add("B", typeof(string));this.C128_Code.Columns.Add("C", typeof(string));this.C128_Code.Columns.Add("Encoding", typeof(string));this.C128_Code.Rows.Add(new object[]{"0"," "," ","00","11011001100"});this.C128_Code.Rows.Add(new object[]{"1","!","!","01","11001101100"});this.C128_Code.Rows.Add(new object[]{"2","\"","\"","02","11001100110"});this.C128_Code.Rows.Add(new object[]{"3","#","#","03","10010011000"});this.C128_Code.Rows.Add(new object[]{"4","$","$","04","10010001100"});this.C128_Code.Rows.Add(new object[]{"5","%","%","05","10001001100"});this.C128_Code.Rows.Add(new object[]{"6","&","&","06","10011001000"});this.C128_Code.Rows.Add(new object[]{"7","'","'","07","10011000100"});this.C128_Code.Rows.Add(new object[]{"8","(","(","08","10001100100"});this.C128_Code.Rows.Add(new object[]{"9",")",")","09","11001001000"});this.C128_Code.Rows.Add(new object[]{"10","*","*","10","11001000100"});this.C128_Code.Rows.Add(new object[]{"11","+","+","11","11000100100"});this.C128_Code.Rows.Add(new object[]{"12",",",",","12","10110011100"});this.C128_Code.Rows.Add(new object[]{"13","-","-","13","10011011100"});this.C128_Code.Rows.Add(new object[]{"14",".",".","14","10011001110"});this.C128_Code.Rows.Add(new object[]{"15","/","/","15","10111001100"});this.C128_Code.Rows.Add(new object[]{"16","0","0","16","10011101100"});this.C128_Code.Rows.Add(new object[]{"17","1","1","17","10011100110"});this.C128_Code.Rows.Add(new object[]{"18","2","2","18","11001110010"});this.C128_Code.Rows.Add(new object[]{"19","3","3","19","11001011100"});this.C128_Code.Rows.Add(new object[]{"20","4","4","20","11001001110"});this.C128_Code.Rows.Add(new object[]{"21","5","5","21","11011100100"});this.C128_Code.Rows.Add(new object[]{"22","6","6","22","11001110100"});this.C128_Code.Rows.Add(new object[]{"23","7","7","23","11101101110"});this.C128_Code.Rows.Add(new object[]{"24","8","8","24","11101001100"});this.C128_Code.Rows.Add(new object[]{"25","9","9","25","11100101100"});this.C128_Code.Rows.Add(new object[]{"26",":",":","26","11100100110"});this.C128_Code.Rows.Add(new object[]{"27",";",";","27","11101100100"});this.C128_Code.Rows.Add(new object[]{"28","<","<","28","11100110100"});this.C128_Code.Rows.Add(new object[]{"29","=","=","29","11100110010"});this.C128_Code.Rows.Add(new object[]{"30",">",">","30","11011011000"});this.C128_Code.Rows.Add(new object[]{"31","?","?","31","11011000110"});this.C128_Code.Rows.Add(new object[]{"32","@","@","32","11000110110"});this.C128_Code.Rows.Add(new object[]{"33","A","A","33","10100011000"});this.C128_Code.Rows.Add(new object[]{"34","B","B","34","10001011000"});this.C128_Code.Rows.Add(new object[]{"35","C","C","35","10001000110"});this.C128_Code.Rows.Add(new object[]{"36","D","D","36","10110001000"});this.C128_Code.Rows.Add(new object[]{"37","E","E","37","10001101000"});this.C128_Code.Rows.Add(new object[]{"38","F","F","38","10001100010"});this.C128_Code.Rows.Add(new object[]{"39","G","G","39","11010001000"});this.C128_Code.Rows.Add(new object[]{"40","H","H","40","11000101000"});this.C128_Code.Rows.Add(new object[]{"41","I","I","41","11000100010"});this.C128_Code.Rows.Add(new object[]{"42","J","J","42","10110111000"});this.C128_Code.Rows.Add(new object[]{"43","K","K","43","10110001110"});this.C128_Code.Rows.Add(new object[]{"44","L","L","44","10001101110"});this.C128_Code.Rows.Add(new object[]{"45","M","M","45","10111011000"});this.C128_Code.Rows.Add(new object[]{"46","N","N","46","10111000110"});this.C128_Code.Rows.Add(new object[]{"47","O","O","47","10001110110"});this.C128_Code.Rows.Add(new object[]{"48","P","P","48","11101110110"});this.C128_Code.Rows.Add(new object[]{"49","Q","Q","49","11010001110"});this.C128_Code.Rows.Add(new object[]{"50","R","R","50","11000101110"});this.C128_Code.Rows.Add(new object[]{"51","S","S","51","11011101000"});this.C128_Code.Rows.Add(new object[]{"52","T","T","52","11011100010"});this.C128_Code.Rows.Add(new object[]{"53","U","U","53","11011101110"});this.C128_Code.Rows.Add(new object[]{"54","V","V","54","11101011000"});this.C128_Code.Rows.Add(new object[]{"55","W","W","55","11101000110"});this.C128_Code.Rows.Add(new object[]{"56","X","X","56","11100010110"});this.C128_Code.Rows.Add(new object[]{"57","Y","Y","57","11101101000"});this.C128_Code.Rows.Add(new object[]{"58","Z","Z","58","11101100010"});this.C128_Code.Rows.Add(new object[]{"59","[","[","59","11100011010"});this.C128_Code.Rows.Add(new object[]{"60","\\","\\","60","11101111010"});this.C128_Code.Rows.Add(new object[]{"61","]","]","61","11001000010"});this.C128_Code.Rows.Add(new object[]{"62","^","^","62","11110001010"});this.C128_Code.Rows.Add(new object[]{"63","_","_","63","10100110000"});this.C128_Code.Rows.Add(new object[]{"64","\0","`","64","10100001100"});this.C128_Code.Rows.Add(new object[]{"65",Convert.ToChar(1).ToString(),"a","65","10010110000"});this.C128_Code.Rows.Add(new object[]{"66",Convert.ToChar(2).ToString(),"b","66","10010000110"});this.C128_Code.Rows.Add(new object[]{"67",Convert.ToChar(3).ToString(),"c","67","10000101100"});this.C128_Code.Rows.Add(new object[]{"68",Convert.ToChar(4).ToString(),"d","68","10000100110"});this.C128_Code.Rows.Add(new object[]{"69",Convert.ToChar(5).ToString(),"e","69","10110010000"});this.C128_Code.Rows.Add(new object[]{"70",Convert.ToChar(6).ToString(),"f","70","10110000100"});this.C128_Code.Rows.Add(new object[]{"71",Convert.ToChar(7).ToString(),"g","71","10011010000"});this.C128_Code.Rows.Add(new object[]{"72",Convert.ToChar(8).ToString(),"h","72","10011000010"});this.C128_Code.Rows.Add(new object[]{"73",Convert.ToChar(9).ToString(),"i","73","10000110100"});this.C128_Code.Rows.Add(new object[]{"74",Convert.ToChar(10).ToString(),"j","74","10000110010"});this.C128_Code.Rows.Add(new object[]{"75",Convert.ToChar(11).ToString(),"k","75","11000010010"});this.C128_Code.Rows.Add(new object[]{"76",Convert.ToChar(12).ToString(),"l","76","11001010000"});this.C128_Code.Rows.Add(new object[]{"77",Convert.ToChar(13).ToString(),"m","77","11110111010"});this.C128_Code.Rows.Add(new object[]{"78",Convert.ToChar(14).ToString(),"n","78","11000010100"});this.C128_Code.Rows.Add(new object[]{"79",Convert.ToChar(15).ToString(),"o","79","10001111010"});this.C128_Code.Rows.Add(new object[]{"80",Convert.ToChar(16).ToString(),"p","80","10100111100"});this.C128_Code.Rows.Add(new object[]{"81",Convert.ToChar(17).ToString(),"q","81","10010111100"});this.C128_Code.Rows.Add(new object[]{"82",Convert.ToChar(18).ToString(),"r","82","10010011110"});this.C128_Code.Rows.Add(new object[]{"83",Convert.ToChar(19).ToString(),"s","83","10111100100"});this.C128_Code.Rows.Add(new object[]{"84",Convert.ToChar(20).ToString(),"t","84","10011110100"});this.C128_Code.Rows.Add(new object[]{"85",Convert.ToChar(21).ToString(),"u","85","10011110010"});this.C128_Code.Rows.Add(new object[]{"86",Convert.ToChar(22).ToString(),"v","86","11110100100"});this.C128_Code.Rows.Add(new object[]{"87",Convert.ToChar(23).ToString(),"w","87","11110010100"});this.C128_Code.Rows.Add(new object[]{"88",Convert.ToChar(24).ToString(),"x","88","11110010010"});this.C128_Code.Rows.Add(new object[]{"89",Convert.ToChar(25).ToString(),"y","89","11011011110"});this.C128_Code.Rows.Add(new object[]{"90",Convert.ToChar(26).ToString(),"z","90","11011110110"});this.C128_Code.Rows.Add(new object[]{"91",Convert.ToChar(27).ToString(),"{","91","11110110110"});this.C128_Code.Rows.Add(new object[]{"92",Convert.ToChar(28).ToString(),"|","92","10101111000"});this.C128_Code.Rows.Add(new object[]{"93",Convert.ToChar(29).ToString(),"}","93","10100011110"});this.C128_Code.Rows.Add(new object[]{"94",Convert.ToChar(30).ToString(),"~","94","10001011110"});this.C128_Code.Rows.Add(new object[]{"95",Convert.ToChar(31).ToString(),Convert.ToChar(127).ToString(),"95","10111101000"});this.C128_Code.Rows.Add(new object[]{"96",Convert.ToChar(202).ToString(),Convert.ToChar(202).ToString(),"96","10111100010"});this.C128_Code.Rows.Add(new object[]{"97",Convert.ToChar(201).ToString(),Convert.ToChar(201).ToString(),"97","11110101000"});this.C128_Code.Rows.Add(new object[]{"98","SHIFT","SHIFT","98","11110100010"});this.C128_Code.Rows.Add(new object[]{"99","CODE_C","CODE_C","99","10111011110"});this.C128_Code.Rows.Add(new object[]{"100","CODE_B",Convert.ToChar(203).ToString(),"CODE_B","10111101110"});this.C128_Code.Rows.Add(new object[]{"101",Convert.ToChar(203).ToString(),"CODE_A","CODE_A","11101011110"});this.C128_Code.Rows.Add(new object[]{"102",Convert.ToChar(200).ToString(),Convert.ToChar(200).ToString(),Convert.ToChar(200).ToString(),"11110101110"});this.C128_Code.Rows.Add(new object[]{"103","START_A","START_A","START_A","11010000100"});this.C128_Code.Rows.Add(new object[]{"104","START_B","START_B","START_B","11010010000"});this.C128_Code.Rows.Add(new object[]{"105","START_C","START_C","START_C","11010011100"});this.C128_Code.Rows.Add(new object[]{"","STOP","STOP","STOP","11000111010"});
}
通过阅读BarCode类生成图片的源码,如下:
private Bitmap Generate_Image(){if (this.Encoded_Value == ""){throw new Exception("EGENERATE_IMAGE-1: Must be encoded first.");}Bitmap bitmap = null;DateTime now = DateTime.Now;TYPE encoded_Type = this.Encoded_Type;if (encoded_Type != TYPE.ITF14){bitmap = new Bitmap(this.Width, this.Height);int num = this.Width / this.Encoded_Value.Length;int num2 = 1;if (this.Encoded_Type == TYPE.PostNet){num2 = 2;}int num3;switch (this.Alignment){case AlignmentPositions.CENTER:num3 = this.Width % this.Encoded_Value.Length / 2;break;case AlignmentPositions.LEFT:num3 = 0;break;case AlignmentPositions.RIGHT:num3 = this.Width % this.Encoded_Value.Length;break;default:num3 = this.Width % this.Encoded_Value.Length / 2;break;}if (num <= 0){throw new Exception("EGENERATE_IMAGE-2: Image size specified not large enough to draw image. (Bar size determined to be less than 1 pixel)");}int i = 0;using (Graphics graphics = Graphics.FromImage(bitmap)){graphics.Clear(this.BackColor);using (Pen pen = new Pen(this.BackColor, (float)(num / num2))){using (Pen pen2 = new Pen(this.ForeColor, (float)(num / num2))){while (i < this.Encoded_Value.Length){if (this.Encoded_Type == TYPE.PostNet){if (this.Encoded_Value[i] != '1'){graphics.DrawLine(pen2, new Point(i * num + num3 + 1, this.Height), new Point(i * num + num3 + 1, this.Height / 2));}graphics.DrawLine(pen, new Point(i * (num * num2) + num3 + num + 1, 0), new Point(i * (num * num2) + num3 + num + 1, this.Height));}if (this.Encoded_Value[i] == '1'){graphics.DrawLine(pen2, new Point(i * num + num3 + 1, 0), new Point(i * num + num3 + 1, this.Height));}i++;}}}}if (this.IncludeLabel){this.Label_Generic(bitmap);}}else{bitmap = new Bitmap(this.Width, this.Height);int num4 = (int)((double)bitmap.Width / 12.05);int num5 = Convert.ToInt32((double)bitmap.Width * 0.05);int num = (bitmap.Width - num4 * 2 - num5 * 2) / this.Encoded_Value.Length;int num3 = (bitmap.Width - num4 * 2 - num5 * 2) % this.Encoded_Value.Length / 2;if (num <= 0 || num5 <= 0){throw new Exception("EGENERATE_IMAGE-3: Image size specified not large enough to draw image. (Bar size determined to be less than 1 pixel or quiet zone determined to be less than 1 pixel)");}int i = 0;using (Graphics graphics = Graphics.FromImage(bitmap)){graphics.Clear(this.BackColor);using (Pen pen2 = new Pen(this.ForeColor, (float)num)){pen2.Alignment = PenAlignment.Right;while (i < this.Encoded_Value.Length){if (this.Encoded_Value[i] == '1'){graphics.DrawLine(pen2, new Point(i * num + num3 + num4 + num5, 0), new Point(i * num + num3 + num4 + num5, this.Height));}i++;}pen2.Width = (float)bitmap.Height / 8f;pen2.Color = this.ForeColor;pen2.Alignment = PenAlignment.Inset;graphics.DrawLine(pen2, new Point(0, 0), new Point(bitmap.Width, 0));graphics.DrawLine(pen2, new Point(0, bitmap.Height), new Point(bitmap.Width, bitmap.Height));graphics.DrawLine(pen2, new Point(0, 0), new Point(0, bitmap.Height));graphics.DrawLine(pen2, new Point(bitmap.Width, 0), new Point(bitmap.Width, bitmap.Height));}}if (this.IncludeLabel){this.Label_ITF14(bitmap);}}this._Encoded_Image = bitmap;this._EncodingTime += (DateTime.Now - now).TotalMilliseconds;return bitmap;}
影响一维码生成结果有
1 AlignmentPositions对齐方式:靠左、居中、靠右和默认
2 一维码的宽度,如果宽度不够,那就绘制的线条不全,就会出现无法识别的问题
相关文章:

带你人工识别C#开源库BarcodeLib生成的一维码Code128
我们是做HIS系统开发的,前段时间发现某些处方的一维码出现无法识别的情况。看了一下一维码生成的逻辑,使用到了BarcodeLib库,经过反复确认,我们程序是没有问题的。后面不得不反编译看一下BarcodeLib生成一维码的逻辑。最后调整一维…...
软考 系统架构设计师系列知识点之系统架构评估(6)
接前一篇文章:软考 系统架构设计师系列知识点之系统架构评估(5) 所属章节: 第8章. 系统质量属性与架构评估 第2节. 系统架构评估 8.2.1 系统架构评估中的重要概念 相关试题 3. 正确识别风险点、非风险点、敏感点和权衡点是进行软…...

指挥通信车360度3d虚拟互动展示系统的优势及特点
通信车是装有通信装备,用于保障通信联络的专用车辆,用于偏僻/特殊环境下的机动通信。并且机动通信局装备通常分为应急综合通信车、网络管理车、程控电话车、自适应跳频电台车、数字扩频接力车、散射通信车、卫星通信车、光缆引接车、线缆收放车和通信电源…...

根据Aurora发送时序,造Aurora 发送数据包
首先Aurora采用AXIS接口 由于后续需要进行AXIS接口 不同时钟域的数据位宽转换(64bit和256bit之间的转换),因此分两次走。 第一种方法:采用AXIS数据位宽转换IP AXIS跨时钟域IP 第二种方法:逻辑完成 下面记录逻辑…...

vue实现一个账号在同一时间只有一个能登录的效果
目录 1.实现方法 2.实现示例 1.实现方法 要实现一个账号在同一时间只有一个能登录的效果,你可以使用以下步骤来实现: 在后端服务器端设置一个标志位,用于标记用户是否已登录。这个标志位可以存储在数据库中或者缓存在服务器内存中。当用户…...

react-hook-form。 useFieldArray Controller 必填,报错自动获取较多疑问记录
背景 动态多个数据Controller包裹时候,原生html标签input可以add时候自动获取焦点,聚焦到最近不符合要求的元素上面 matiral的TextField同样可以可是x-date-pickers/DatePicker不可以❌ 是什么原因呢,内部提供foucs??属…...
最近收藏的各类好用API接口,含免费次数
IP应用场景- IPv4:IPv4应用场景是获取IP场景属性的在线调用接口,具备识别IP真人度,提升风控和反欺诈等业务能力。IP应用场景基于地理和网络特征的IP场景划分技术,将IP划分为含数据中心、交换中心、家庭宽带、CDN、云网络等共计18类…...
第01章 Linux下MySQL的安装与使用
第01章 Linux下MySQL的安装与使用 1. 安装前说明 1.1 查看是否安装过MySQL 如果你是用rpm安装, 检查一下RPM PACKAGE: rpm -qa | grep -i mysql # -i 忽略大小写检查mysql service: systemctl status mysqld.service1.2 MySQL的卸载 1. 关闭 mysql…...

kafka入门教程,介绍全面
1、官网下载最新版本的kafka,里面已经集成zookeeper。直接解压到D盘 2、配置文件修改,config目录下面的zookeeper.properties. 设置zookeeper数据目录 dataDirD:/kafka_2.12-3.6.0/tmp/zookeeper 3、修改kafka的配置文件server.properties. 主要修…...

万字解析设计模式之原型模式与建造者模式
一、原型模式 1.1概述 原型模式是一种创建型设计模式,其目的是使用已有对象作为原型来创建新的对象。原型模式的核心是克隆,即通过复制已有对象来创建新对象,而不是通过创建新对象的过程中独立地分配和初始化所有需要的资源。这种方式可以节…...

深度学习数据集大合集—疾病、植物、汽车等
最近又收集了一大批深度学习数据集,今天分享给大家!废话不多说,直接上数据! 1、招聘欺诈数据集 招聘欺诈数据集:共收集了 200,000 条数据,来自三个网站。 该数据集共收集了 200.000 条数据,分别…...

物联网中的ESP8266该这么用!
🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 1. 前言…...
django中循环生成的多个btn,只有第一个btn会弹出模态框
django中循环生成的多个btn,只有第一个btn会弹出模态框 需求:为每个button按钮都绑定同一点击事件,点击每个btn都可弹出模态框 原因 问题代码 <button idbtnDel type"button" class"btn btn-primary btn-lg" > […...

JVM第二十三讲:Java动态调试技术原理
Java动态调试技术原理 本文是JVM第二十三讲,Java动态调试技术原理。转载自 美团技术团队胡健的Java 动态调试技术原理及实践,通过学习java agent方式进行动态调试,了解目前很多大厂开源的一些基于此的调试工具 (例如来自阿里开源的Arthas)。 …...

制造企业如何三步实现进销存管理?
制造企业如何三步实现进销存管理? 一、什么是进销存软件? 进销存软件是一种针对制造业企业设计的管理软件系统,旨在协调和优化企业的生产、采购、销售以及库存管理等方面的活动。该系统的主要目标是提高企业的生产效率、降低库存成本、优化…...
封装localstorage为对象 js
export const LocalStorageManager {recordKey: "Record",// 获取本地存储中的值get(key) {try {const value localStorage.getItem(key);if (value null || value undefined || value "") {return null;}return JSON.parse(localStorage.getItem(key…...
算法通关村第五关|白银|队栈和Hash的经典算法题【持续更新】
1.用栈实现队列 用两个栈实现队列。 class MyQueue {Deque<Integer> inStack;Deque<Integer> outStack;public MyQueue() {inStack new LinkedList<Integer>();outStack new LinkedList<Integer>();}public void push(int x) {inStack.push(x);}pu…...

java--构造器
1.构造器是什么样子 构造器分为无参构造(就相当于你有车子,但是里面是空的)和带参构造(就相当于你有车子,里面还有几个妹纸,你真该死啊) 2.构造器有什么特点 创建对象时,对象会去调用构造器。 3.构造器的常见应用场景 创建对象…...

纪念基于JavaScript 实现的后台桌面 UI 设计
目录 前言 C/S 到 B/S ASP Builder 的诞生 关于 Craneoffice.net 开发环境配置 后台界面的 UI 区域要素 桌面系统的想法和设计 搜索引擎 导航面板 快捷访问 二级导航 小组件及其它 设置桌面壁纸 小时钟 附件小程序 计算器界面设计 日历与任务 系统设置 天气小…...
C++11 auto限制
限制: auto 不能用于函数参数auto 不能用于非静态成员变量auto 无法定义数组auto 无法推导出模板参数 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生…...

【存储基础】SAN存储基础知识
文章目录 1. 什么是SAN存储?2. SAN存储组网架构3. SAN存储的主要协议SCSI光纤通道(FC)协议iSCSIFCoENVMe-oFIB 4. SAN存储的关键技术Thin Provision:LUN空间按需分配Tier:分级存储Cache:缓存机制QoS&#x…...
MySQL半同步复制配置和参数详解
目录 1 成功配置主从复制 2 加载插件 3 半同步复制监控 4 半同步复制参数 1 成功配置主从复制 操作步骤参考:https://blog.csdn.net/zyb378747350/article/details/148309545 2 加载插件 #主库上 MySQL 8.0.26 之前版本: mysql>INSTALL PLUGIN rpl_semi_syn…...

pikachu通关教程-File Inclusion
文件包含漏洞 本地文件包含 http://127.0.0.1:1000/pikachu/vul/fileinclude/fi_local.php?filenamefile1.php&submit%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 首先我们把file1改成file2,发现切换成功 那我们可不可以上传本地文件呢,答案是肯定的&a…...
ios tableview吸顶
由于项目需要实现一个上滑吸顶的效果,网上也看到有很多种方式实现,但是如果加上下拉刷新的功能会导致界面异常,还有第三方库实现方式库,太繁琐了,下面是我的实现方式,效果如下: tablevie滑动吸顶…...
每日算法刷题计划Day20 6.2:leetcode二分答案3道题,用时1h20min
9.3048.标记所有下标的最早秒数(中等) 3048. 标记所有下标的最早秒数 I - 力扣(LeetCode) 思想 1.给你两个下标从 1 开始的整数数组 nums 和 changeIndices ,数组的长度分别为 n 和 m 。 一开始,nums 中所有下标都是未标记的&a…...

【Java学习笔记】异常
异常(Exception) 一、基本介绍 在 Java 程序中,将运行中发生的不正常情况称为 “异常”,开发过程中的语法错误和运行时发生的异常情况是不一样的。 二、异常的分类 1. Error(错误):Java 虚拟…...

鸿蒙next系统以后会取代安卓吗?
点击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 官方可没说过取代谁谁,三足鼎立不好吗?三分天下,并立共存。 鸿蒙基于Linux,有人说套壳;ios/macos基于Unix,说它ios开源了…...

Perforce P4产品简介:无限扩展+全球协作+安全管控+工具集成(附下载)
本产品简介由Perforce中国授权合作伙伴——龙智编辑整理,旨在带您快速了解Perforce P4版本控制系统的强大之处。 世界级无限可扩展的版本控制系统 Perforce P4(原Helix Core)是业界领先的版本控制平台,备受19家全球Top20 AAA级游…...

Linux(10)——第二个小程序(自制shell)
目录 编辑 一、引言与动机 📝背景 📝主要内容概括 二、全局数据 三、环境变量的初始化 ✅ 代码实现 四、构造动态提示符 ✅ 打印提示符函数 ✅ 提示符生成函数 ✅获取用户名函数 ✅获取主机名函数 ✅获取当前目录名函数 五、命令的读取与…...
HTML实战:响应式个人资料页面
我将创建一个现代化的响应式个人资料页面,展示HTML在实际应用中的强大功能。这个页面将包含多个实战元素:导航栏、个人简介、技能展示、作品集和联系表单。 设计思路 使用Flexbox和Grid布局实现响应式设计 添加CSS过渡效果增强交互体验 实现深色/浅色模式切换功能 创建悬停动…...