C#读写EM4205/4305/4469卡复制ID卡制做FDX-B动物标签源码

news2024/11/28 11:53:21

        EM4305/EM4205卡是采用瑞士EM微电子公司工作频率为125kHz,具有读、写功能的非接触式RFID射频芯片,它具有功耗低、可提供多种数据传输速率和数据编码方法等特点,适合射频芯片ISO 11784/11785规范,该芯片被广泛应用于动物识别和跟踪、智能门锁、通道门禁等一卡通管理系统。

       EM4305/EM4205卡的EEPROM储存空间为512位,分为16个块,每个块32位,块1为UID块,块2为密码块,块4为配置块,块14、15为锁定标志块。可在-40℃~85℃在温度下工作。

       EM4305/EM4205卡可以修改其配置信息将其模拟成兼容EM4100的ID卡,可用于ID卡的复制。

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

 函数声明

 //------------------------------------------------------------------------------------------------------------------------------------------------------
        //外部函数声明:让设备发出声响
        [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用于返回编号 
        //------------------------------------------------------------------------------------------------------------------------------------------------------    
        //只读EM4100卡号
        [DllImport("OUR_IDR.dll", EntryPoint = "idr_read", CallingConvention = CallingConvention.StdCall)]
        public static extern byte idr_read(byte[] serial);//serial返回卡号        
        //------------------------------------------------------------------------------------------------------------------------------------------------------    
        //只读卡号,只读一次EM4100卡,必须拿开卡才能再读到
        [DllImport("OUR_IDR.dll", EntryPoint = "idr_read_once", CallingConvention = CallingConvention.StdCall)]
        public static extern byte idr_read_once(byte[] serial);//serial返回卡号
        //------------------------------------------------------------------------------------------------------------------------------------------------------
        //EM4205/4305卡写配置块
        [DllImport("OUR_IDR.dll", EntryPoint = "em4305_init", CallingConvention = CallingConvention.StdCall)]
        public static extern byte em4305_init(byte ctrlword, byte[] seria, byte[] key, byte[] configdata);
        //------------------------------------------------------------------------------------------------------------------------------------------------------
        //EM4469/4569卡写配置块
        [DllImport("OUR_IDR.dll", EntryPoint = "em4469_init", CallingConvention = CallingConvention.StdCall)]
        public static extern byte em4469_init(byte ctrlword, byte[] seria, byte[] key, byte[] configdata);
        //------------------------------------------------------------------------------------------------------------------------------------------------------
        //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);
        //------------------------------------------------------------------------------------------------------------------------------------------------------
        //EM4205/4305/4469/4569卡改密码
        [DllImport("OUR_IDR.dll", EntryPoint = "em4305_changekey", CallingConvention = CallingConvention.StdCall)]
        public static extern byte em4305_changekey(byte ctrlword, byte[] seria, byte[] oldkey, byte[] newkey);
        //------------------------------------------------------------------------------------------------------------------------------------------------------
        //用EM4205/4305卡制作ID卡(也就是EM4100及兼容卡)
        [DllImport("OUR_IDR.dll", EntryPoint = "em4305_to4100", CallingConvention = CallingConvention.StdCall)]
        public static extern byte em4305_to4100(byte ctrlword, byte[] seria, byte[] oldkey, byte[] newkey, byte[] myuidbuf);
        //-----------------------------------------------------------------------------------------------------------------------------------------------------        
        //只读HID卡号
        [DllImport("OUR_IDR.dll", EntryPoint = "hid_read", CallingConvention = CallingConvention.StdCall)]
        public static extern byte hid_read(byte[] serial);//serial返回卡号 

读取EM4205/4305/4469/4569芯片内数据

 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 PasswStr = textBox14.Text.Trim();
            string seriaStr = textBox15.Text.Trim();

            if (checkBox1.Checked)  //本次操作需要密码验证
            {
                myctrlword = (byte)(myctrlword + NEEDKEY);
                try
                {
                    oldpicckey[0] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16));
                    oldpicckey[1] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16));
                    oldpicckey[2] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16));
                    oldpicckey[3] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox14.Select();
                    return;
                }
            }

            if (checkBox2.Checked)  //仅操作指定卡号的卡
            {
                try
                {
                    myctrlword = (byte)(myctrlword + NEEDSERIAL);
                    mypiccserial[0] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16));
                    mypiccserial[1] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16));
                    mypiccserial[2] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16));
                    mypiccserial[3] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox15.Select();
                    return;
                }
            }

            j = 0;
            mypiccblockflag[0] = 0x00;
            for (int i = 0; i < 8; i++)
            {
                if (myCheckBox[i].Checked)
                {
                    mypiccblockflag[0] = (byte)(mypiccblockflag[0] + Math.Pow(2, i));
                    j++;
                }
            }

            mypiccblockflag[1] = 0x00;
            for (int i = 0; i < 8; i++)
            {
                if (myCheckBox[8 + i].Checked)
                {
                    mypiccblockflag[1] = (byte)(mypiccblockflag[1] + Math.Pow(2, i));
                    j++;
                }
            }

            status = em4305_read(myctrlword, mypiccserial, oldpicckey, mypiccblockflag, mypiccdata);
            if (status == 0)
            {
                string blockdata = "";
                for (int i = 0; i < mypiccdata[1]; i++)
                {
                    blockdata = blockdata + mypiccdata[2 + i].ToString("X2");
                }
                textBox4.Text = blockdata;

                j = 0;
                for (int i = 0; i < 16; i++)
                {
                    if (myCheckBox[i].Checked)
                    {
                        myTextBox[i].Text = blockdata.Substring(j, 8);
                        j = j + 8;
                    }
                }

                seriaStr = "";
                for (int i = 0; i < 4; i++)
                {
                    seriaStr = seriaStr + mypiccserial[i].ToString("X2");
                }
                idr_beep(30);
                MessageBox.Show("读卡成功,卡无线转输分频比:" + mypiccdata[0].ToString("D") + ",卡号:" + seriaStr, "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);


            }
            else { MessageErrInf(status); }

写数据到EM4205/4305/4469/4569芯片内

byte status;     //存放返回值
            int j;
            byte myctrlword = 0x00;               //控制字
            byte[] oldpicckey = new byte[4];      //密码
            byte[] mypiccserial = new byte[4];    //卡序列号
            byte[] mypiccdata = new byte[50];     //写卡数据缓冲
            byte[] mypiccblockflag = new byte[2]; //指定读哪一块
            string PasswStr = textBox14.Text.Trim();
            string seriaStr = textBox15.Text.Trim();

            int chtxt = Form1_chedkdata();
            if (chtxt != 100)
            {
                MessageBox.Show("写卡数据输入错误,请重新输入!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                myTextBox[chtxt].Select();
                return;
            }

            if (checkBox1.Checked)  //本次操作需要密码验证
            {
                myctrlword = (byte)(myctrlword + NEEDKEY);
                try
                {
                    oldpicckey[0] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16));
                    oldpicckey[1] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16));
                    oldpicckey[2] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16));
                    oldpicckey[3] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox14.Select();
                    return;
                }
            }

            if (checkBox2.Checked)  //仅操作指定卡号的卡
            {
                try
                {
                    myctrlword = (byte)(myctrlword + NEEDSERIAL);
                    mypiccserial[0] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16));
                    mypiccserial[1] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16));
                    mypiccserial[2] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16));
                    mypiccserial[3] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox15.Select();
                    return;
                }
            }

            if (myCheckBox[1].Checked)
            {
                MessageBox.Show("块1为uid块,只能读取不可写入!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (myCheckBox[4].Checked)
            {
                MessageBox.Show("块4为配置区,只能在初始化函数中操作!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (myCheckBox[14].Checked)
            {
                MessageBox.Show("块14为锁定标志块,只能在初始化函数中操作!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (myCheckBox[15].Checked)
            {
                MessageBox.Show("块15为配置区,只能在初始化函数中操作!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            j = 0;
            string WriteStr = "";

            mypiccblockflag[0] = 0x00;
            for (int i = 0; i < 8; i++)
            {
                if (myCheckBox[i].Checked)
                {
                    mypiccblockflag[0] = (byte)(mypiccblockflag[0] + Math.Pow(2, i));
                    WriteStr = WriteStr + myTextBox[i].Text;
                    j++;
                }
            }

            mypiccblockflag[1] = 0x00;
            for (int i = 0; i < 8; i++)
            {
                if (myCheckBox[8 + i].Checked)
                {
                    mypiccblockflag[1] = (byte)(mypiccblockflag[1] + Math.Pow(2, i));
                    WriteStr = WriteStr + myTextBox[8 + i].Text;
                    j++;
                }
            }

            for (int i = 0; i < WriteStr.Length / 2; i++)
            {
                mypiccdata[i] = Convert.ToByte(Convert.ToInt32(WriteStr.Substring(i * 2, 2), 16));
            }

            status = em4305_write(myctrlword, mypiccserial, oldpicckey, mypiccblockflag, mypiccdata);
            if (status == 0)
            {
                seriaStr = "";
                for (int i = 0; i < 4; i++)
                {
                    seriaStr = seriaStr + mypiccserial[i].ToString("X2");
                }
                idr_beep(30);
                MessageBox.Show("卡号:" + seriaStr + "写卡成功!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else { MessageErrInf(status); }

将EM4205/4305卡制做成ID门禁卡

 byte status;     //存放返回值
            byte myctrlword = 0x00;  //控制字
            byte[] oldpicckey = new byte[4];  //密码
            byte[] newpicckey = new byte[4];  //新密码
            byte[] mypiccserial = new byte[6];  //卡序列号

            byte[] mypiccblockflag = new byte[2]; //指定读哪一块
            string PasswStr = textBox14.Text.Trim();
            string seriaStr = textBox15.Text.Trim();
            string newpassw = textBox20.Text.Trim();
            string newuidstr = textBox3.Text.Trim();

            if (checkBox1.Checked)  //本次操作需要密码验证
            {
                myctrlword = (byte)(myctrlword + NEEDKEY);
                try
                {
                    oldpicckey[0] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16));
                    oldpicckey[1] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16));
                    oldpicckey[2] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16));
                    oldpicckey[3] = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox14.Select();
                    return;
                }
            }

            if (checkBox2.Checked)  //仅操作指定卡号的卡
            {
                try
                {
                    myctrlword = (byte)(myctrlword + NEEDSERIAL);
                    mypiccserial[0] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16));
                    mypiccserial[1] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16));
                    mypiccserial[2] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16));
                    mypiccserial[3] = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox15.Select();
                    return;
                }
            }

            if (checkBox11.Checked)  //修改卡片密码
            {
                try
                {
                    myctrlword = (byte)(myctrlword + KEYENABLE);
                    newpicckey[0] = Convert.ToByte(Convert.ToInt32(newpassw.Substring(0, 2), 16));
                    newpicckey[1] = Convert.ToByte(Convert.ToInt32(newpassw.Substring(2, 2), 16));
                    newpicckey[2] = Convert.ToByte(Convert.ToInt32(newpassw.Substring(4, 2), 16));
                    newpicckey[3] = Convert.ToByte(Convert.ToInt32(newpassw.Substring(6, 2), 16));
                }
                catch
                {
                    MessageBox.Show("密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBox20.Select();
                    return;
                }
            }

            if (radioButton3.Checked)
            {
                if (newuidstr.Length != 10 || !checkhex(newuidstr)) { MessageBox.Show("要写入的10位16进制卡号错误,请输入正确的10位16进制卡号!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
                byte[] myuid = new byte[5];        //写入的新卡号
                try
                {
                    myuid[0] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(0, 2), 16));
                    myuid[1] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(2, 2), 16));
                    myuid[2] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(4, 2), 16));
                    myuid[3] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(6, 2), 16));
                    myuid[4] = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(8, 2), 16));
                }
                catch
                {
                    MessageBox.Show("新卡号输入错误,请输入8位16进制数的卡号!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    textBoxuid1.Select();
                    return;
                }

                status = em4305_to4100(myctrlword, mypiccserial, oldpicckey, newpicckey, myuid);
                if (status == 0)
                {
                    idr_beep(50);
                    MessageBox.Show("卡号:" + System.Convert.ToString(myuid[1] * 256 * 256 * 256 + myuid[2] * 256 * 256 + myuid[3] * 256 + myuid[4]) + " 写卡成功变成ID卡!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else { MessageErrInf(status); }
            }
            else
            {
                MessageBox.Show("此功能暂未开发!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

将EM4205/4305/4469/4569卡写入FDX-B动物标签

 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); }

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

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

相关文章

《C++高级编程》读书笔记(五、六:面向对象设计设计可重用代码)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 过程化的思考方式 过程语言&#xff08;例如 C&#xff09;将…

玄奘文旅集团主办学习强企玄奘之路戈壁挑战赛在敦煌圆满完赛!

“学习改变命运&#xff0c;强企复兴中国”&#xff0c;2023年4月16日-20日&#xff0c;由玄奘文旅集团主办的“第23届26届学习强企玄奘之路戈壁挑战赛&#xff08;联赛&#xff09;”在千年古城敦煌圆满落幕&#xff01; 这是商界各行业的一次跨界融合&#xff0c;也是疫情过…

感性了解一下互斥和信号量

一、互斥的四个概念 我们把大家都能看到的资源叫做&#xff1a;公共资源 a、互斥&#xff1a;任何一个时刻&#xff0c;都只允许一个执行流在进行共享资源的访问——加锁 b、我们把任何一个时刻&#xff0c;都只允许一个执行流进行访问的共享资源叫做临界资源 c、临界资源需…

【TA100】图形 2.4 传统经验光照模型详解

一、光照模型 ● 一种模拟自然光照过程的计算机模型 ● 本次课程可以这样理解&#xff1a;光线与物体表面的作用 ● 分类 ○ 基于物理的光照模型&#xff08;PBR&#xff09;&#xff08;有可依据的公式&#xff09; ○ 经验模型&#xff08;进行了一些近似、模拟&#xff0c;…

【小呆的概率论学习笔记】正态分布的代数运算

文章目录 1. 正态分布简介1. 正态分布的数字特征2. 正态分布的代数运算a. 单随机变量的代数运算b. 两个正态分布随机变量的和c. 多个正态分布随机变量的线性组合 1. 正态分布简介 正态分布应该是概率论和数理统计中最重要的一类概率分布&#xff0c;最早的完整论述是由数学王子…

自用-华东师范大学硕士学位论文LATEX模板

文章目录 前言部分页面效果预览使用说明&#xff1a;毕业论文LaTeX模板1. 安装LaTeX发行版和TeX Studio&#xff1a;2. 下载毕业论文模板&#xff1a;3. 编辑论文内容&#xff1a;**标题和作者信息&#xff1a;****摘要和关键词&#xff1a;****章节内容&#xff1a;****图片插…

【Linux】-关于调试器gdb的介绍和使用

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、Linux中的debug和release二、gdb的使用**1.进入调试****2.显示代码*…

配置SSH免密登陆

配置SSH免密登陆 1.生成公私密钥对1&#xff09;检查是否已存在公私钥对2&#xff09;生成公私钥对 2.上传公钥到服务器3.ssh-add&#xff08;mac的坑点&#xff09;4.使用配置文件连接 博主是MAC用户&#xff0c;文章参考知乎 1.生成公私密钥对 1&#xff09;检查是否已存在…

Redis高性能设计之epoll和IO多路复用深度解析

一 多路复用 并发多客户端连接&#xff0c; 在多路复用之前最简单和典型的方案&#xff1a;同步阻塞网络IO模型 这种模型的特点就是用一个进程来处理一个网络连接&#xff08;一个用户请求&#xff09;&#xff0c;比如一段典型的示例代码如下&#xff1a; //直接调用recv函数…

【Java】JAVASE面向对象知识点总结

面向对象 概念 现实生活&#xff1a; ​ 类&#xff1a;抽象的概念&#xff0c;把具有相同特征和操作的事物归为一类 ​ 先有实体&#xff0c;再有类的概念 代码世界&#xff1a; ​ 类&#xff1a;抽象的概念&#xff0c;把具有相同属性和方法的对象归为一类 ​ 编写顺序&…

epoll的LT与ET模式以及阻塞和非阻塞

文章目录 1、基本概念2、关于在socket和EPOLL中的阻塞与非阻塞3、几种IO模型的触发方式4、代码验证5、总结 1、基本概念 Level_triggered(水平触发)&#xff1a;当被监控的文件描述符上有可读写事件发生时&#xff0c;epoll_wait()会通知处理程序去读写。如果这次没有把数据一次…

Flask-蓝图

1、使用步骤&#xff1a; 创建蓝图 blue Blueprint("myblue01", __name__) 使用蓝图装饰视图函数 blue.route(/) def index():return index 将蓝图注册到app中 from appdemo_blueprint import blue app.register_blueprint(blue) 2、以包的形式使用蓝图 <…

Java007——Java注释学习

围绕以下3点介绍&#xff1a; 1、什么是Java注释&#xff1f; 2、Java注释的作用&#xff1f; 3、Java注释长什么样&#xff0c;以及怎么使用Java注释&#xff1f; 一、什么是Java注释&#xff1f; Java注释是在Java程序中用来描述代码的特殊语句。 注释被忽略并且不被编译器…

PyTorch 深度学习 || 专题六:PyTorch 数据的准备

PyTorch 数据的准备 1. 生成数据的准备工作 import torch import torch.utils.data as Data#准备建模数据 x torch.unsqueeze(torch.linspace(-1, 1, 500), dim1) # 生成列向量 y x.pow(3) # yx^3#设置超参数 batch_size 15 # 分块大小 torch.manual_seed(10) # 设置种子点…

javascript基础三十:JavaScript如何实现上拉加载,下拉刷新?

一、前言 下拉刷新和上拉加载这两种交互方式通常出现在移动端中 本质上等同于PC网页中的分页&#xff0c;只是交互形式不同 开源社区也有很多优秀的解决方案&#xff0c;如iscroll、better-scroll、pulltorefresh.js库等等 这些第三方库使用起来非常便捷 我们通过原生的方…

哈工大 大数据 数据库实验(3) 物理数据库设计--索引结构

指导书: HIT邹老师数据库实验三资源-CSDN文库 导入数据库 操作 两个元组的分布规律 1.查询元组的数据分布 SELECT COUNT(*) FROM Foo; SELECT COUNT(*) FROM Foo WHERE id 0; SELECT COUNT(*) FROM Foo WHERE a 0; SELECT COUNT(*) FROM Foo WHERE b 0; SELECT COUNT(*…

c++ 解析html与htmlcxx库

目录 1&#xff0c;htmlcxx Github 版本源码下载 2&#xff0c;htmlcxx Linux 版本源码下载 3&#xff0c;htmlcxx 解析例子 1&#xff0c;htmlcxx Github 版本源码下载 正如在前一篇文章 c CFile 类 里提到的&#xff0c;我想要从指定的 html 文件里提取…

【裸机开发】镜像文件内部信息构成

由于当前使用的是裸板&#xff0c;没有OS&#xff0c;DDR的初始化、文件保存地址都尚未确定&#xff0c;所以我们生成二进制文件以后&#xff0c;是无法直接放到开发板上运行的。 因此&#xff0c;我们一般会在二进制文件之前加一些头部信息&#xff0c;这些头部信息会告诉开发…

xsync集群分发脚本

脚本&#xff1a; #!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] thenecho Not Enough Arguement!exit; fi #2. 遍历集群所有机器 for host in hadoop02 hadoop03 doecho $host #3. 遍历所有目录&#xff0c;挨个发送for file in $do#4. 判断文件是否存在if [ -e $file ]th…

文本三剑客awk:命令讲解

awk-命令讲解&#xff1a; 一、awk&#xff1a; 1.定义&#xff1a; &#xff08;1&#xff09;在 Linux/UNIX 系统中&#xff0c;awk 是一个功能强大的编辑工具&#xff0c;逐行读取输入文本&#xff0c;默认以空格或tab键作为分隔符作为分隔。并按模式或者条件执行编辑命令…