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

带你人工识别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系统开发的&#xff0c;前段时间发现某些处方的一维码出现无法识别的情况。看了一下一维码生成的逻辑&#xff0c;使用到了BarcodeLib库&#xff0c;经过反复确认&#xff0c;我们程序是没有问题的。后面不得不反编译看一下BarcodeLib生成一维码的逻辑。最后调整一维…...

软考 系统架构设计师系列知识点之系统架构评估(6)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之系统架构评估&#xff08;5&#xff09; 所属章节&#xff1a; 第8章. 系统质量属性与架构评估 第2节. 系统架构评估 8.2.1 系统架构评估中的重要概念 相关试题 3. 正确识别风险点、非风险点、敏感点和权衡点是进行软…...

指挥通信车360度3d虚拟互动展示系统的优势及特点

通信车是装有通信装备&#xff0c;用于保障通信联络的专用车辆&#xff0c;用于偏僻/特殊环境下的机动通信。并且机动通信局装备通常分为应急综合通信车、网络管理车、程控电话车、自适应跳频电台车、数字扩频接力车、散射通信车、卫星通信车、光缆引接车、线缆收放车和通信电源…...

根据Aurora发送时序,造Aurora 发送数据包

首先Aurora采用AXIS接口 由于后续需要进行AXIS接口 不同时钟域的数据位宽转换&#xff08;64bit和256bit之间的转换&#xff09;&#xff0c;因此分两次走。 第一种方法&#xff1a;采用AXIS数据位宽转换IP AXIS跨时钟域IP 第二种方法&#xff1a;逻辑完成 下面记录逻辑…...

vue实现一个账号在同一时间只有一个能登录的效果

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

react-hook-form。 useFieldArray Controller 必填,报错自动获取较多疑问记录

背景 动态多个数据Controller包裹时候&#xff0c;原生html标签input可以add时候自动获取焦点&#xff0c;聚焦到最近不符合要求的元素上面 matiral的TextField同样可以可是x-date-pickers/DatePicker不可以❌ 是什么原因呢&#xff0c;内部提供foucs&#xff1f;&#xff1f;属…...

最近收藏的各类好用API接口,含免费次数

IP应用场景- IPv4&#xff1a;IPv4应用场景是获取IP场景属性的在线调用接口&#xff0c;具备识别IP真人度&#xff0c;提升风控和反欺诈等业务能力。IP应用场景基于地理和网络特征的IP场景划分技术&#xff0c;将IP划分为含数据中心、交换中心、家庭宽带、CDN、云网络等共计18类…...

第01章 Linux下MySQL的安装与使用

第01章 Linux下MySQL的安装与使用 1. 安装前说明 1.1 查看是否安装过MySQL 如果你是用rpm安装, 检查一下RPM PACKAGE&#xff1a; rpm -qa | grep -i mysql # -i 忽略大小写检查mysql service&#xff1a; systemctl status mysqld.service1.2 MySQL的卸载 1. 关闭 mysql…...

kafka入门教程,介绍全面

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

万字解析设计模式之原型模式与建造者模式

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

深度学习数据集大合集—疾病、植物、汽车等

最近又收集了一大批深度学习数据集&#xff0c;今天分享给大家&#xff01;废话不多说&#xff0c;直接上数据&#xff01; 1、招聘欺诈数据集 招聘欺诈数据集&#xff1a;共收集了 200,000 条数据&#xff0c;来自三个网站。 该数据集共收集了 200.000 条数据&#xff0c;分别…...

物联网中的ESP8266该这么用!

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 1. 前言…...

django中循环生成的多个btn,只有第一个btn会弹出模态框

django中循环生成的多个btn&#xff0c;只有第一个btn会弹出模态框 需求&#xff1a;为每个button按钮都绑定同一点击事件&#xff0c;点击每个btn都可弹出模态框 原因 问题代码 <button idbtnDel type"button" class"btn btn-primary btn-lg" > […...

JVM第二十三讲:Java动态调试技术原理

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

制造企业如何三步实现进销存管理?

制造企业如何三步实现进销存管理&#xff1f; 一、什么是进销存软件&#xff1f; 进销存软件是一种针对制造业企业设计的管理软件系统&#xff0c;旨在协调和优化企业的生产、采购、销售以及库存管理等方面的活动。该系统的主要目标是提高企业的生产效率、降低库存成本、优化…...

封装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.构造器是什么样子 构造器分为无参构造(就相当于你有车子&#xff0c;但是里面是空的)和带参构造(就相当于你有车子&#xff0c;里面还有几个妹纸&#xff0c;你真该死啊) 2.构造器有什么特点 创建对象时&#xff0c;对象会去调用构造器。 3.构造器的常见应用场景 创建对象…...

纪念基于JavaScript 实现的后台桌面 UI 设计

目录 前言 C/S 到 B/S ASP Builder 的诞生 关于 Craneoffice.net 开发环境配置 后台界面的 UI 区域要素 桌面系统的想法和设计 搜索引擎 导航面板 快捷访问 二级导航 小组件及其它 设置桌面壁纸 小时钟 附件小程序 计算器界面设计 日历与任务 系统设置 天气小…...

C++11 auto限制

限制&#xff1a; auto 不能用于函数参数auto 不能用于非静态成员变量auto 无法定义数组auto 无法推导出模板参数 推荐一个零声学院项目课&#xff0c;个人觉得老师讲得不错&#xff0c;分享给大家&#xff1a; 零声白金学习卡&#xff08;含基础架构/高性能存储/golang云原生…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

HTTPS证书一年多少钱?

HTTPS证书作为保障网站数据传输安全的重要工具&#xff0c;成为众多网站运营者的必备选择。然而&#xff0c;面对市场上种类繁多的HTTPS证书&#xff0c;其一年费用究竟是多少&#xff0c;又受哪些因素影响呢&#xff1f; 首先&#xff0c;HTTPS证书通常在PinTrust这样的专业平…...