C# 读写FDX-B(ISO11784/85)动物标签源码

本示例使用的发卡器:EM4305 EM4469 ISO11784/85协议125K低频FXD-B动物标签读写发卡器-淘宝网 (taobao.com) 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;  //调用动态库一定要加入这个引用namespace FDX_B
{public partial class Form1 : Form{//------------------------------------------------------------------------------------------------------------------------------------------------------//外部函数声明:让设备发出声响[DllImport("OUR_IDR.dll", EntryPoint = "idr_beep", CallingConvention = CallingConvention.StdCall)]static extern byte idr_beep(UInt32 xms);//xms单位为毫秒 //------------------------------------------------------------------------------------------------------------------------------------------------------    //读取设备编号,可做为软件加密狗用,也可以根据此编号在公司网站上查询保修期限[DllImport("OUR_IDR.dll", EntryPoint = "pcdgetdevicenumber", CallingConvention = CallingConvention.StdCall)]static extern byte pcdgetdevicenumber(byte[] devicenumber);//devicenumber用于返回编号 //------------------------------------------------------------------------------------------------------------------------------------------------------    //EM4205/4305/4469/4569卡读卡[DllImport("OUR_IDR.dll", EntryPoint = "em4305_read", CallingConvention = CallingConvention.StdCall)]public static extern byte em4305_read(byte ctrlword, byte[] seria, byte[] key, byte[] blockflag, byte[] readdata);//------------------------------------------------------------------------------------------------------------------------------------------------------//EM4205/4305/4469/4569卡写卡[DllImport("OUR_IDR.dll", EntryPoint = "em4305_write", CallingConvention = CallingConvention.StdCall)]public static extern byte em4305_write(byte ctrlword, byte[] seria, byte[] key, byte[] blockflag, byte[] writedata);//------------------------------------------------------------------------------------------------------------------------------------------------------//EM4205/4305/4469/4569卡锁定块[DllImport("OUR_IDR.dll", EntryPoint = "em4305_lock", CallingConvention = CallingConvention.StdCall)]public static extern byte em4305_lock(byte ctrlword, byte[] seria, byte[] key, byte[] blockflag);//------------------------------------------------------------------------------------------------------------------------------------------------------//T5557卡读卡[DllImport("OUR_IDR.dll", EntryPoint = "t5557_read", CallingConvention = CallingConvention.StdCall)]public static extern byte t5557_read(byte ctrlword, byte[] seria, byte[] key, byte[] blockflag, byte[] readdata);//------------------------------------------------------------------------------------------------------------------------------------------------------//T5557卡写卡[DllImport("OUR_IDR.dll", EntryPoint = "t5557_write", CallingConvention = CallingConvention.StdCall)]public static extern byte t5557_write(byte ctrlword, byte[] seria, byte[] key, byte[] blockflag, byte[] writedata);public Form1(){InitializeComponent();}private void MessageErrInf(byte Errcode){switch (Errcode){case 1:MessageBox.Show("错误代码:" + Errcode.ToString() + ",卡放得远 或 需要密码才能写卡 或 块已锁定!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 2:MessageBox.Show("错误代码:" + Errcode.ToString() + ",本卡尚未开启密码功能,函数myctrlword中无需加入NEEDKEY", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 3:MessageBox.Show("错误代码:" + Errcode.ToString() + ",需要密码才能读卡,函数myctrlword要加入NEEDKEY", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 4:MessageBox.Show("错误代码:" + Errcode.ToString() + ",卡放得远 或 需要密码才能读卡!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 5:MessageBox.Show("错误代码:" + Errcode.ToString() + ",密码错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 8:MessageBox.Show("错误代码:" + Errcode.ToString() + ",操作失败,请将卡放在读卡器的感应区!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 12:MessageBox.Show("错误代码:" + Errcode.ToString() + ",卡放得远 或 密码错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 21:MessageBox.Show("错误代码:" + Errcode.ToString() + ",没有动态库!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 22:MessageBox.Show("错误代码:" + Errcode.ToString() + ",动态库或驱动程序异常!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 23:MessageBox.Show("错误代码:" + Errcode.ToString() + ",驱动程序错误或发卡器尚未安装!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 24:MessageBox.Show("错误代码:" + Errcode.ToString() + ",操作超时,一般是动态库没有反映!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 25:MessageBox.Show("错误代码:" + Errcode.ToString() + ",发送字数不够!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;case 28:MessageBox.Show("错误代码:" + Errcode.ToString() + ",输入错误,可能是启用卡号密码保护而没在页面左上角选择带密码操作!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;default:MessageBox.Show("错误代码:" + Errcode.ToString() + ",未知的错误信息,错误代码:" + Errcode.ToString(), "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;}}private ushort GetCrc16Ccitt(byte[] bytes)  //计算crc16ccitt校验码{ushort crc = 0x0000;int i, j;for (j = 0; j < bytes.Length; j++){crc ^= bytes[j];for (i = 0; i < 8; i++){if ((crc & 0x0001) > 0){crc = (ushort)((crc >> 1) ^ 0x8408);}else { crc = (ushort)(crc >> 1); }}}return crc;}private ushort checkcrc16citt(byte[] bytes)  // 检测crc16ccitt校验{ushort crc = 0x0000;int i, j;for (j = 1; j <= 10; j++){crc ^= bytes[j];for (i = 0; i < 8; i++){if ((crc & 0x0001) > 0){crc = (ushort)((crc >> 1) ^ 0x8408);}else { crc = (ushort)(crc >> 1); }}}return crc;}private Boolean checkgetbitinf(string bitstr, byte[] info) //检测是否有效的FDX-B协议信息{for (int i = 0; i < 14; i++){string thisbit = bitstr.Substring((i + 1) * 9 - 9, 9);if (thisbit.Substring(0, 1) == "1"){info[13 - i] =(byte) Convert.ToInt16(thisbit.Substring(1, 8),2);}else { return false; };}ushort crcitt = checkcrc16citt(info);if (crcitt == 0){return true;}else { return false; }            }private void button1_Click(object sender, EventArgs e){byte status;                          //存放返回值int j;byte myctrlword = 0x00;               //控制字byte[] oldpicckey = new byte[4];      //密码byte[] mypiccserial = new byte[4];    //卡序列号byte[] mypiccdata = new byte[70];     //读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12个块的数据byte[] mypiccblockflag = new byte[2]; //指定读哪一块string bitstr;textBox1.Text = "0000";textBox2.Text = "000000000000";textBox3.Text = "00000";textBox4.Text = "00000000";mypiccblockflag[0] = 224;mypiccblockflag[1] = 1;status = em4305_read(myctrlword, mypiccserial, oldpicckey, mypiccblockflag, mypiccdata);if (status == 0){idr_beep(30);string blockdata = "";for (int i = 0; i < mypiccdata[1]; i++){bitstr ="00000000"+ Convert.ToString(mypiccdata[2 + i], 2);bitstr = bitstr.Substring(bitstr.Length - 8);blockdata =bitstr+ blockdata;}byte[] info = new byte[14];if (checkgetbitinf(blockdata, info)){string Serialnumberbit = "";bitstr = "00000000" + Convert.ToString(info[1], 2);bitstr = bitstr.Substring(bitstr.Length - 8);Serialnumberbit = bitstr + Serialnumberbit;bitstr = "00000000" + Convert.ToString(info[2], 2);bitstr = bitstr.Substring(bitstr.Length - 8);Serialnumberbit = bitstr + Serialnumberbit;bitstr = "00000000" + Convert.ToString(info[3], 2);bitstr = bitstr.Substring(bitstr.Length - 8);Serialnumberbit = bitstr + Serialnumberbit;bitstr = "00000000" + Convert.ToString(info[4], 2);bitstr = bitstr.Substring(bitstr.Length - 8);Serialnumberbit = bitstr + Serialnumberbit;bitstr = "00000000" + Convert.ToString(info[5], 2);bitstr = bitstr.Substring(bitstr.Length - 8);string conutrybit = "";conutrybit = bitstr.Substring(0, 2);bitstr = bitstr.Substring(bitstr.Length - 6);Serialnumberbit = bitstr + Serialnumberbit;Int64 SerialnumberId = Convert.ToInt64(Serialnumberbit, 2);textBox2.Text = SerialnumberId.ToString("D12");bitstr = "00000000" + Convert.ToString(info[6], 2);bitstr = bitstr.Substring(bitstr.Length - 8);conutrybit = bitstr + conutrybit;Int16 conutryid = Convert.ToInt16(conutrybit, 2);textBox1.Text = conutryid.ToString("D4");bitstr = "00000000" + Convert.ToString(info[7], 2);bitstr = bitstr.Substring(bitstr.Length - 8);if (bitstr.Substring(7, 1) == "1") { checkBox3.Checked = true; } else { checkBox3.Checked = false; }string Reservedbit = bitstr.Substring(0, 7);bitstr = "00000000" + Convert.ToString(info[8], 2);bitstr = bitstr.Substring(bitstr.Length - 8);if (bitstr.Substring(0, 1) == "1") { checkBox4.Checked = true; } else { checkBox4.Checked = false; }Reservedbit = bitstr.Substring(1, 7) + Reservedbit;Int16 Reserved = Convert.ToInt16(Reservedbit, 2);textBox3.Text = Reserved.ToString("D5");string Extensionbit = "";bitstr = "00000000" + Convert.ToString(info[11], 2);bitstr = bitstr.Substring(bitstr.Length - 8);Extensionbit = bitstr + Extensionbit;bitstr = "00000000" + Convert.ToString(info[12], 2);bitstr = bitstr.Substring(bitstr.Length - 8);Extensionbit = bitstr + Extensionbit;bitstr = "00000000" + Convert.ToString(info[13], 2);bitstr = bitstr.Substring(bitstr.Length - 8);Extensionbit = bitstr + Extensionbit;Int32 Extension = Convert.ToInt32(Extensionbit, 2);textBox4.Text = Extension.ToString("D8");}else{MessageBox.Show("不是有效的FDX-B协议标签!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);}} else { MessageErrInf(status); }}private void button2_Click(object sender, EventArgs e){Int16 conutryid = Convert.ToInt16(textBox1.Text.Trim());Int64 SerialnumberId = Convert.ToInt64(textBox2.Text.Trim());Int16 Reserved = Convert.ToInt16(textBox3.Text.Trim());Int32 Extension = Convert.ToInt32(textBox4.Text.Trim());if (conutryid > 1023){MessageBox.Show("Country国家代码的取值范围是:0~1023!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox1.SelectionStart = 0;textBox1.SelectionLength = textBox1.Text.Trim().Length;textBox1.Select();return;}if (SerialnumberId > 274877906943){MessageBox.Show("SerialNumber序列号的取值范围是:0~274877906943!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox2.SelectionStart = 0;textBox2.SelectionLength = textBox2.Text.Trim().Length;textBox2.Select();return;}if (Reserved > 16383){MessageBox.Show("Reserved保留信息的取值范围是:0~16383!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox3.SelectionStart = 0;textBox3.SelectionLength = textBox3.Text.Trim().Length;textBox3.Select();return;}if (Extension > 16777215){MessageBox.Show("Extension扩展信息的取值范围是:0~16777215!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);textBox4.SelectionStart = 0;textBox4.SelectionLength = textBox4.Text.Trim().Length;textBox4.Select();return;}string Extensionbit = "000000000000000000000000"+Convert.ToString(Extension, 2);Extensionbit = Extensionbit.Substring(Extensionbit.Length - 24);string Reservedbit = "00000000000000" + Convert.ToString(Reserved, 2);Reservedbit = Reservedbit.Substring(Reservedbit.Length - 14);if (checkBox4.Checked) { Reservedbit = "1" + Reservedbit; } else { Reservedbit = "0" + Reservedbit; }if (checkBox3.Checked) { Reservedbit =  Reservedbit+"1"; } else { Reservedbit =  Reservedbit+"0"; }string conutrybit = "0000000000" + Convert.ToString(conutryid, 2);conutrybit = conutrybit.Substring(conutrybit.Length - 10);string Serialnumberbit = "00000000000000000000000000000000000000" + Convert.ToString(SerialnumberId, 2);Serialnumberbit = Serialnumberbit.Substring(Serialnumberbit.Length - 38);string fdxbitstr = "10000000000";       //前导码fdxbitstr = "1" + Serialnumberbit.Substring(30, 8) + fdxbitstr;fdxbitstr = "1" + Serialnumberbit.Substring(22, 8) + fdxbitstr;fdxbitstr = "1" + Serialnumberbit.Substring(14, 8) + fdxbitstr;fdxbitstr = "1" + Serialnumberbit.Substring(6, 8) + fdxbitstr;fdxbitstr = "1" + conutrybit.Substring(8, 2) + Serialnumberbit.Substring(0, 6) + fdxbitstr;fdxbitstr = "1" + conutrybit.Substring(0, 8) + fdxbitstr;fdxbitstr = "1" + Reservedbit.Substring(8, 8) + fdxbitstr;fdxbitstr = "1" + Reservedbit.Substring(0, 8) + fdxbitstr;byte[] info = new byte[8]; for (int i = 0; i < 8; i++){string thisbit = fdxbitstr.Substring((i + 1) * 9 - 9, 9);if (thisbit.Substring(0, 1) == "1"){info[7 - i] = (byte)Convert.ToInt16(thisbit.Substring(1, 8), 2);}}ushort crc16ccitt = GetCrc16Ccitt(info);string crcbit = "0000000000000000" + Convert.ToString(crc16ccitt, 2);crcbit = crcbit.Substring(crcbit.Length - 16);fdxbitstr = "1" + crcbit.Substring(8, 8) + fdxbitstr;fdxbitstr = "1" + crcbit.Substring(0, 8) + fdxbitstr;fdxbitstr = "1" + Extensionbit.Substring(16, 8) + fdxbitstr;fdxbitstr = "1" + Extensionbit.Substring(8, 8) + fdxbitstr;fdxbitstr = "1" + Extensionbit.Substring(0, 8) + fdxbitstr;byte[] writebuf = new byte[16];for (int i = 0; i < 16; i++){string thisbit = fdxbitstr.Substring((i + 1) * 8 - 8, 8);writebuf[15 - i] = (byte)Convert.ToInt16(thisbit, 2);}byte status;                          //存放返回值byte myctrlword = 0x00;               //控制字byte[] oldpicckey = new byte[4];      //密码byte[] mypiccserial = new byte[4];    //卡序列号byte[] mypiccblockflag = new byte[2]; //指定读哪一块mypiccblockflag[0] = 224;mypiccblockflag[1] = 1;status = em4305_write(myctrlword, mypiccserial, oldpicckey, mypiccblockflag, writebuf);if (status == 0){if (checkBox2.Checked){em4305_lock(myctrlword, mypiccserial, oldpicckey, mypiccblockflag);}string seriaStr = "";for (int i = 0; i < 4; i++){seriaStr = seriaStr + mypiccserial[i].ToString("X2");}idr_beep(30);MessageBox.Show("卡号:" + seriaStr + "写FDX-B协议标签成功!", "提示:", MessageBoxButtons.OK , MessageBoxIcon.Information );if (checkBox1.Checked){SerialnumberId = SerialnumberId + 1;textBox2.Text = SerialnumberId.ToString("D12");}}else { MessageErrInf(status); }}private void textBox1_KeyPress(object sender, KeyPressEventArgs e){if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)8){e.Handled = true;}else { e.Handled = false; }}private void textBox2_KeyPress(object sender, KeyPressEventArgs e){if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)8){e.Handled = true;}else { e.Handled = false; }}private void textBox3_KeyPress(object sender, KeyPressEventArgs e){if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)8){e.Handled = true;}else { e.Handled = false; }}private void textBox4_KeyPress(object sender, KeyPressEventArgs e){if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)8){e.Handled = true;}else { e.Handled = false; }}private void checkBox2_CheckedChanged(object sender, EventArgs e){if (checkBox2.Checked){if (MessageBox.Show("选择写卡成功后锁定保护将不能再次更改标签信息,确定要启动保护功能吗!", "提示:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes){checkBox2.Checked = false;}}}private void button3_Click(object sender, EventArgs e){byte status = idr_beep(50);if(status!=0){MessageErrInf(status);}}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/170306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rk3588配置uac功能,android13使能uac及adb的复合设备

最近&#xff0c;因新增需求需要在现有产品上增加UAC的功能&#xff0c;查阅并学习相关知识后&#xff0c;在rk3588 SOC硬件平台搭载android13系统平台上成功配置了uac及uac&adb的复合设备。基于开源共享精神希望给大家提供些参考。 1.技术可行性预研 &#xff08;1&#…

【一起来学kubernetes】7、k8s中的ingress详解

引言配置示例负载均衡的实现负载均衡策略实现模式实现方案Nginx类型Ingress实现Treafik类型Ingress实现HAProxy类型ingress实现Istio类型ingress实现APISIX类型ingress实现 更多 引言 Ingress是Kubernetes集群中的一种资源类型&#xff0c;用于实现用域名的方式访问Kubernetes…

自建私有化证书颁发机构(Certificate Authority,CA)实战之 《0x02 Nginx 配置 https双向认证》

自建CA实战之 《0x02 Nginx 配置 https双向认证》 上一章节我们已经实现了Nginx上配置https单向认证&#xff0c;主要场景为客户端验证服务端的身份&#xff0c;但是服务端不验证客户端的身份。 本章节我们将实现Nginx上配置https双向认证&#xff0c;主要场景为客户端验证服…

C++ 实现位图

引出 面试题&#xff1a;给出 40 亿个不重复的无符号整数&#xff0c;没有排过序。给定一个无符号整数&#xff0c;如何快速判断这个数是否在这 40 亿个无符号整数中。[ 腾讯面试题 ] 想法一&#xff1a;将 40 亿个数据存放到 set 里面&#xff0c;然后再查找指定的无符号整数。…

论文阅读——MCAN(cvpr2019)

补充一下MCAN-VQA&#xff1a; 对图片的处理&#xff1a;首先输入图片到Faster R-CNN&#xff0c;会先设定一个判断是否检测到物体的阈值&#xff0c;这样动态的生成m∈[10,100]个目标&#xff0c;然后从检测到的对应的区域通过平均池化提取特征。第i个物体特征表示为&#xff…

MUYUCMS v2.1:一款开源、轻量级的内容管理系统

MuYuCMS&#xff1a;一款基于Thinkphp开发的轻量级开源内容管理系统&#xff0c;为企业、个人站长提供快速建站解决方案。它具有以下的环境要求&#xff1a; 支持系统&#xff1a;Windows/Linux/Mac WEB服务器&#xff1a;Apache/Nginx/ISS PHP版本&#xff1a;php > 5.6 (…

发布鸿蒙的第一个java应用

1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程&#xff08;当前用的IDEA 3.1.1 Release&#xff09; 选择第一个&#xff0c;其他的默认只能用(API9)版本&#xff0c;搞了半天才发现8&#xff…

11 月 25 日 ROS 学习笔记——3D 建模与仿真

文章目录 前言一、在 ROS 中自定义机器人的3D模型1. 在 rviz 里查看3D模型2. xacro 二、Gazebo1. urdf 集成 gazebo2. 综合应用1). 运动控制及里程计2). 雷达仿真3). 摄像头信息仿真4). kinect 深度相机仿真5). 点云 前言 本文为11 月 25 日 ROS 学习笔记——3D 建模与仿真&am…

STK Components 基础篇

1.开发包 STK Components 访问AGI官网&#xff0c;注册并登录后&#xff0c;从官网下载开发包&#xff1a;https://support.agi.com/downloads/&#xff0c;下载成功后可以申请许可证&#xff0c;AGI会向你注册的邮箱地址发送有效期半年的使用授权许可文件&#xff08;lic文件…

最详细手把手教你安装 Git + TortoiseGit 及使用

软件下载 从 Git 官网 下载 Git 安装程序&#xff0c;点击 Download for Windows&#xff1a; 点击下载 64-bit Git for Windows Setup: Git for Windows Setup 为安装版本&#xff0c;建议选择此版本Git for Windows Portable 为绿色免安装版本 从 TortoiseGit 官网 下载 T…

Spring Boot + hutool 创建海报图片

Spring Boot hutool 创建海报图片 /*** 分享,生成图片* param id* return*/GetMapping("/getShareImg")public void getShareImg(String id,HttpServletResponse response) throws IOException {CouponConsignSaleClassify byId couponConsignSaleClassifyService…

OpenCV简介及安装

前言 因为最近想做图像处理、人脸检测/识别之类的相关开发&#xff0c;所以就开始补OpenCV的相关知识&#xff0c;便开个专栏用于记录学习历程和在学习过程中遇到的一些值得注意的重点和坑。 学习过程基本上也是面向官方文档和Google。 简介 OpenCV(开源的计算机视觉库)是基于…

C编译过程

寻觅GCC 如果你已经安装了Clion&#xff0c;那么gcc就在根目录下。 如果没有&#xff0c;那么需要去minGW的官网下载安装。添加到环境变量中。 编写C代码 #include <stdio.h>#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) static int a 123;int main() {int i 0;c…

【云备份】文件操作实用工具类设计

文章目录 为什么要单独设计文件工具类&#xff1f;整体实现Filesize ——文件大小stat接口 LastMTime ——最后一次修改时间LastATime —— 最后一次访问时间FileName —— 文件名称GetPostLen ——获取文件指定位置 指定长度的数据GetContnet —— 读取文件数据SetContent ——…

云计算领域的第三代浪潮!

根据IDC不久前公布的数据&#xff0c;2023年上半年中国公有云服务整体市场规模(IaaS/PaaS/SaaS)为190.1亿美元&#xff0c;阿里云IaaS、PaaS市场份额分别为29.9%和27.9%&#xff0c;都远超第二名&#xff0c;是无可置疑的行业领头羊。 随着人工智能&#xff08;AI&#xff09;…

cmake install接口常用方式介绍

cmake install接口常用方式介绍 1 Synopsis2 Introduction2.1 DESTINATION <dir>2.2 PERMISSIONS <permission>...2.3 CONFIGURATIONS <config>...2.4 COMPONENT <component>2.5 EXCLUDE_FROM_ALL2.6 RENAME <name>2.7 OPTIONAL 3 Signatures4 E…

走近科学之《MySQL 的秘密》

走近科学之《MySQL 的秘密》 mysql 存储引擎、索引、执行计划、事务、锁、分库分表、优化 1、存储引擎&#xff08;storage engines&#xff09; 存储引擎规定了数据存储时的不同底层实现&#xff0c;如存储机制、索引、锁、事务等。 可以通过 show engines 命令查看当前服务…

在 STM32 上实现温度补偿和校正

本文介绍了如何在 STM32 微控制器上实现温度补偿和校正&#xff0c;以提高温度传感器的测量精度。首先&#xff0c;我们将简要介绍温度补偿和校正的原理和目的。然后&#xff0c;我们将详细讨论在 STM32 上实现温度补偿和校正的步骤和方法。同时&#xff0c;提供了一个简单的示…

Android逆向实战 - MIUI调起三方应用系统拦截弹窗分析

近期&#xff0c;发现在部分Android手机调起其他应用时&#xff0c;会弹出一个系统弹窗拦截调起&#xff0c;需要用户二次确认。经过内部众测&#xff0c;发现绝大多数是小米手机&#xff0c;而且跟Android版本没有直接关系&#xff0c;猜测是MIUI某次升级引入的功能。这篇文章…

oracle的debjob挂載及查詢

背景 有一個需求需要定時去執行一個produce&#xff0c;可以使用oracle的dbjob定時執行&#xff0c;相比較之前的vbs更加絲滑 --傳遞produce 開始的時間 頻率 declarea number;beginDBMS_JOB.SUBMIT(a,xx_warehouse_daliy_record_p;,to_date(202311230800,yyyymmddhh24mi),…