Java读写t5557卡源码

news2024/9/19 10:40:00

       T5557卡是美国Atmel公司生产的多功能非接触式射频卡芯片,属于125KHz的低频卡,在国内有广大的应用市场。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操作模式的参数配置块。第0页第7块可以作用户数据块使用,也可以作为保护全部数据的密码(假如在配置块中启用密码功能的话),防止非法改写数据。 第1页的1、2块保存了出厂商信息及唯一出厂ID,只能读取不可更改,T5567、T5577是T5557的升级版。

本示例使用的发卡器:T5557 T5567 T5577低频RFID读写器 EM4100 HID卡复制器 酒店门卡-淘宝网 (taobao.com) 

import com.sun.jna.Library ;
import com.sun.jna.Native;
import com.sun.jna.WString;

interface CLibrary extends Library {
    //DLL绝对路径的地址获取,注意要去空格    
    String filePath = CLibrary.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"OUR_IDR";
    CLibrary sdtapi = (CLibrary) Native.loadLibrary(filePath, CLibrary.class);

    //动态链接库中的方法
    byte idr_beep(int xms);                         //让设备发出声音
    byte pcdgetdevicenumber(byte[] devicenumber);   //读取设备编号
    String pcdgetdevicenumber_str();                //读取设备编号,输出字符串
    byte idr_read(byte[] mypiccserial );            //轻松读ID卡,只要卡在感应区,每次执行此方法都可以读到卡号
    byte hid_read(byte[] mypiccserial );            //轻松读ID卡,只要卡在感应区,每次执行此方法都可以读到卡号
    String idr_read_8h10d_str();                    //读ID卡,输出十位十进制卡号
    byte t5557_read(byte ctrlword, byte[] mypiccserial,byte[] oldkey,byte[] blockflag,byte[] blockdata);     //读t5557卡,
    byte t5557_write(byte ctrlword, byte[] mypiccserial,byte[] oldkey,byte[] blockflag,byte[] blockdata);     //写t5557卡,
    byte t5557_init(byte ctrlword, byte[] mypiccserial,byte[] oldkey,byte[] configdata,byte[] newkey);   //写t5557卡配置值
    byte t5557_changekey(byte ctrlword, byte[] mypiccserial,byte[] oldkey,byte[] newkey);  //修改t5557卡密钥
}
public class IDReader {
    public static final byte NEEDSERIAL=1;  //只对指定UID列号的卡操作
    public static final byte NEEDKEY=2;     //需要用密码认证卡
    public static final byte LOCKBIT=4;     //锁定配置块或数据块,仅对   t5557_init,t5557_write ,t5557_changekey函数有效
    public static final byte KEYENABLE=8;   //启用本卡的密码功能
    public static final byte RESETCARD=16;  //操作成功后重启卡片

    public static void main(String[] args) {
        System.setProperty("jna.encoding", "GBK");
        String filePath = CLibrary.class.getResource("").getPath().replaceFirst("/", "").replaceAll("%20", " ") + "OUR_IDR.DLL";
        System.out.println("本示例引用的DLL文件:" + filePath);

        if (args.length == 0) {
            System.out.println("\n请先输入运行参数!");
            System.out.println("\n参数 0:驱动读卡器嘀一声");
            System.out.println("\n参数 1:读取设备编号");
            System.out.println("\n参数 2:读取设备编号,输出字符串");
            System.out.println("\n参数 3:轻松读ID卡");
            System.out.println("\n参数 4:轻松读HID卡");
            System.out.println("\n参数 5:轻松读ID卡,输出十位十进制卡号");
            System.out.println("\n参数 6:读T5557卡");
            System.out.println("\n参数 7:写T5557卡");
            System.out.println("\n参数 8:写T5557卡配置值");
            System.out.println("\n参数 9:修改T5557卡密钥");
            return;
        }

        //Java中只能使用string1.equals(string2)的方式来比较字符串
        if (args[0].equals("0")) {             //驱动读卡器发嘀一声
            System.out.print("\n0-驱动读卡器嘀一声\n");
            CLibrary.sdtapi.idr_beep(50);
            System.out.print("结果:如果能听到读卡器嘀一声表示成功,否则请检查读卡器是否已连上线!\n\n");

        } else if (args[0].equals("1"))          //读取设备编号,可做为软件加密狗用,也可以根据此编号在公司网站上查询保修期限
        {
            int status;                          //存放返回值
            byte[] devicenumber = new byte[4];   //4字节设备编号

            System.out.print("\n1-读取设备编号\n");
            status = (int) (CLibrary.sdtapi.pcdgetdevicenumber(devicenumber) & 0xff);//& 0xff用于转为无符号行数据
            System.out.print("结果:");
            if (status == 0) {
                CLibrary.sdtapi.idr_beep(38);
                System.out.print("读取成功!设备编号为:" + (devicenumber[0] & 0xff) + "-" + (devicenumber[1] & 0xff) + "-" + (devicenumber[2] & 0xff) + "-" + (devicenumber[3] & 0xff));
            } else {
                PrintErrInf(status);   //错误代码提示
            }

        }else if (args[0].equals("2"))            //读取设备编号,直接输出字符串
        {
            System.out.print("\n2-读取设备编号\n");
            String statustr = CLibrary.sdtapi.pcdgetdevicenumber_str().trim();   //设备编号
            if(statustr.length()==10) {
                CLibrary.sdtapi.idr_beep(38);
                System.out.print("读取成功!设备编号为:" + statustr + "\n");
            }else{
                PrintErrStr(statustr);   //错误字符串代码提示
            }

        }else if (args[0].equals("3"))            //轻松读ID卡
        {
            int status;                           //存放返回值
            byte[] mypiccserial  = new byte[5];   //5字节卡序列号

            System.out.print("\n3-轻松读卡\n");
            status = (int) (CLibrary.sdtapi.idr_read(mypiccserial ) & 0xff);          //只要卡在感应区,每次执行此方法都可以读到卡号
            System.out.print("结果:");
            if (status == 0) {
                CLibrary.sdtapi.idr_beep(38);
                String serialnumber = "";
                for (int i = 0; i < 5; i++) {
                    String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
                    serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
                }
                System.out.print("读取成功!16进制卡序列号为:" + serialnumber+"\n");

                long cardnum;
                cardnum=mypiccserial[4] & 0xff;
                cardnum=cardnum+(mypiccserial[3] & 0xff) *256;
                cardnum=cardnum+(mypiccserial[2] & 0xff) *65536;
                cardnum=cardnum+(mypiccserial[1] & 0xff) *16777216;
                long cardno10 = 0;
                for (int j=28; j>=0; j-=4) {
                    cardno10 = cardno10<<4 | (cardnum>>>j & 0xF);
                }
                System.out.print("换算成10进制卡号:"+String.format("%010d", cardno10)+"\n");
            } else {
                PrintErrInf(status);   //错误代码提示
            }

        }else if (args[0].equals("4"))            //轻松读HID卡
        {
            int status;                           //存放返回值
            byte[] mypiccserial  = new byte[7];   //7字节卡序列号

            System.out.print("\n4-轻松读HID卡\n");
            status = (int) (CLibrary.sdtapi.hid_read(mypiccserial ) & 0xff);
            System.out.print("结果:");
            if (status == 0) {
                CLibrary.sdtapi.idr_beep(38);
                String serialnumber = "";
                for (int i = 0; i < 7; i++) {
                    String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
                    serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
                }
                System.out.print("读取成功!16进制卡序列号为:" + serialnumber+"\n");

                long cardnum;
                cardnum=mypiccserial[6] & 0xff;
                cardnum=cardnum+(mypiccserial[5] & 0xff) *256;
                cardnum=cardnum+(mypiccserial[4] & 0xff) *65536;
                cardnum=cardnum+(mypiccserial[3] & 0xff) *16777216;
                long cardno10 = 0;
                for (int j=28; j>=0; j-=4) {
                    cardno10 = cardno10<<4 | (cardnum>>>j & 0xF);
                }
                System.out.print("换算成8H10D卡号:"+String.format("%010d", cardno10)+"\n");
            } else {
                PrintErrInf(status);   //错误代码提示
            }

        }else if (args[0].equals("5"))            //读ID卡,输出十位十进制卡号
        {
            System.out.print("\n5-读10进制ID卡号\n");
            String statustr = CLibrary.sdtapi.idr_read_8h10d_str().trim();        //只要卡在感应区,每次执行此方法都可以读到卡号
            if(statustr.length()==10) {
                CLibrary.sdtapi.idr_beep(38);
                System.out.print("读卡成功!8H10D卡号为:" + statustr + "\n");
            }else{
                PrintErrStr(statustr);   //错误字符串代码提示
            }

        }else if (args[0].equals("6"))            //读T5557卡
        {
            System.out.print("\n6-读t5557卡\n");
            byte status;                         //存放返回值
            byte myctrlword=0;                   //控制字
            byte[] oldpicckey=new byte[4];       //认证密钥
            byte[] mypiccserial=new byte[6];     //卡UID序列号
            byte[] mypiccdata=new byte[100];      //读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12个块的数据
            byte[] mypiccblockflag=new  byte[2]; //指定本次操作的块
            boolean withkey=false;               //是否要认证卡密钥
            boolean thiscarduit =false;          //是否只操作指定UID序号的卡

            if (withkey){  //本次操作需要密码验证,将认证密钥加入oldpicckey
                myctrlword=(byte)(myctrlword+NEEDKEY);
                String Keyhexstr="12345678";     //认证密钥
                for(int i=0;i<4;i++){
                    oldpicckey[i]=(byte)Integer.parseInt(Keyhexstr.substring(i*2,(i+1)*2),16);
                }
            }
            if(thiscarduit){  //本次只操作指定UID号的卡,mypiccserial
                myctrlword=(byte)(myctrlword+NEEDSERIAL);
                String Uidhexstr="000000000000";   //卡片uid
                for(int i=0;i<6;i++){
                    mypiccserial[i]=(byte)Integer.parseInt(Uidhexstr.substring(i*2,(i+1)*2),16);
                }
            }

            String Seleblockstr0="11111111";  //第0页每块选取状态,从左到右依次表示第7、6、5、4、3、2、1、0块是否要操作,取1表示该块要读,取0表示该块不读,如要读0、1、3 块取值为 00001011,读第0页全部块为 11111111
            String Seleblockstr1="11110";     //第1页每块选取状态,从左到右依次表示第3、2、1、0块是否要操作,取1表示该块要读,取0表示该块不读,该页总计4块,最右边表示页选取值0
            mypiccblockflag[0]=(byte)Integer.parseInt(Seleblockstr0,2);
            mypiccblockflag[1]=(byte)Integer.parseInt(Seleblockstr1,2);

            status = CLibrary.sdtapi.t5557_read(myctrlword,mypiccserial,oldpicckey,mypiccblockflag,mypiccdata);
            if(status == 0) {
                CLibrary.sdtapi.idr_beep(38);
                String cardnohex="";
                for (int i=0;i<6;i++){
                    String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
                    cardnohex = cardnohex + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;
                }
                System.out.print("读卡成功,16进制卡序列号:"+cardnohex+"\n");
                System.out.print("卡无线转输分频比:"+Integer.toString(mypiccdata[0])+"\n");
                if(mypiccdata[1]>0) {
                    String blockdata = "块内数据:";
                    for (int i = 0; i < mypiccdata[1]; i++) {
                        String bytestr = "00" + Integer.toHexString(mypiccdata[2 + i] & 0xff);
                        blockdata = blockdata + bytestr.substring(bytestr.length() - 2, bytestr.length()) + " ";
                    }
                    System.out.print(blockdata+"\n");
                }
            }else {
                PrintErrInf(status);   //错误代码提示
            }

        }else if (args[0].equals("7"))            //写T5557卡
        {
            System.out.print("\n7-写t5557卡块\n");
            byte status;                         //存放返回值
            byte myctrlword=0;                   //控制字
            byte[] oldpicckey=new byte[4];       //认证密钥
            byte[] mypiccserial=new byte[6];     //卡UID序列号
            byte[] mypiccdata=new byte[50];      //读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12个块的数据
            byte[] mypiccblockflag=new  byte[2]; //指定本次操作的块
            boolean withkey=false;               //是否要认证卡密钥
            boolean thiscarduit =false;          //是否只操作指定UID序号的卡

            if (withkey){  //本次操作需要密码验证,将认证密钥加入oldpicckey
                myctrlword=(byte)(myctrlword+NEEDKEY);
                String Keyhexstr="12345678";     //认证密钥
                for(int i=0;i<4;i++){
                    oldpicckey[i]=(byte)Integer.parseInt(Keyhexstr.substring(i*2,(i+1)*2),16);
                }
            }
            if(thiscarduit){  //本次只操作指定UID号的卡,mypiccserial
                myctrlword=(byte)(myctrlword+NEEDSERIAL);
                String Uidhexstr="000000000000";   //卡片uid
                for(int i=0;i<6;i++){
                    mypiccserial[i]=(byte)Integer.parseInt(Uidhexstr.substring(i*2,(i+1)*2),16);
                }
            }

            String Seleblockstr0="11111110";  //第0页每块选取状态,从左到右依次表示第7、6、5、4、3、2、1、0块是否要操作,取1表示该块要写,取0表示该块不写,如要写1、3 块取值为 00001010,第0块是配置块不能用此功能写入,如开启了密码功能,第7块为密码块也不能用此功能写
            String Seleblockstr1="00000";    //第1页每块选取状态,此页只读不可写,
            mypiccblockflag[0]=(byte)Integer.parseInt(Seleblockstr0,2);
            mypiccblockflag[1]=(byte)Integer.parseInt(Seleblockstr1,2);

            String writedatahex="11111111222222223333333344444444555555556666666677777777";   //写入的数据,实际写入数据的块 由mypiccblockflag值决定
            for (int i=0;i<28;i++){
                mypiccdata[i]=(byte)Integer.parseInt(writedatahex.substring(i*2,(i+1)*2),16);
            }
            status = CLibrary.sdtapi.t5557_write(myctrlword,mypiccserial,oldpicckey,mypiccblockflag,mypiccdata);
            if(status == 0) {
                CLibrary.sdtapi.idr_beep(38);
                String cardnohex = "";
                for (int i = 0; i < 6; i++) {
                    String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
                    cardnohex = cardnohex + bytestr.substring(bytestr.length() - 2, bytestr.length());
                }
                System.out.print("写卡成功,16进制卡序列号:" + cardnohex + "\n");
            }else {
                PrintErrInf(status);   //错误代码提示
            }

        }else if (args[0].equals("8"))            //写T5557卡配置块
        {
            System.out.print("\n8-写t5557卡配置块\n");
            byte status;                         //存放返回值
            byte myctrlword=0;                   //控制字
            byte[] oldpicckey=new byte[4];       //认证密钥
            byte[] newpicckey=new byte[4];       //卡片新密钥
            byte[] mypiccserial=new byte[6];     //卡UID序列号
            byte[] configdata=new byte[4];       //配置值
            boolean withkey=false;               //是否要认证卡密钥
            boolean newkeyEn=false;              //是否要开启卡片密钥功能

            if (withkey){  //本次操作需要密码验证,将认证密钥加入oldpicckey
                myctrlword=(byte)(myctrlword+NEEDKEY);
                String oldKeyhexstr="12345678";     //认证密钥
                for(int i=0;i<4;i++){
                    oldpicckey[i]=(byte)Integer.parseInt(oldKeyhexstr.substring(i*2,(i+1)*2),16);
                }
            }

            String configdatahex="00088028";  //卡片出厂默认配置值,不同功能配置值不一样,请查询相关资料
            if (newkeyEn){   //卡片启用密钥保护功能
                myctrlword=(byte)(myctrlword+KEYENABLE);
                configdatahex="00088038";     //开启密钥配置值,不同功能配置值不一样,请查询相关资料
                String newKeyhexstr="12345678";     //新密钥
                for(int i=0;i<4;i++){
                    newpicckey[i]=(byte)Integer.parseInt(newKeyhexstr.substring(i*2,(i+1)*2),16);
                }
            }

            for (int i=0;i<4;i++){
                configdata[i]=(byte)Integer.parseInt(configdatahex.substring(i*2,(i+1)*2),16);
            }

            status = CLibrary.sdtapi.t5557_init(myctrlword,mypiccserial,oldpicckey,configdata,newpicckey);
            if(status == 0) {
                CLibrary.sdtapi.idr_beep(38);
                String cardnohex = "";
                for (int i = 0; i < 6; i++) {
                    String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
                    cardnohex = cardnohex + bytestr.substring(bytestr.length() - 2, bytestr.length());
                }
                System.out.print("写配置块成功,16进制卡序列号:" + cardnohex + "\n");
            }else {
                PrintErrInf(status);   //错误代码提示
            }

        }else if (args[0].equals("9"))            //修改T5557卡密钥
        {
            System.out.print("\n9-修改T5557卡密钥\n");
            byte status;                         //存放返回值
            byte myctrlword=0;                   //控制字
            byte[] oldpicckey=new byte[4];       //认证密钥
            byte[] newpicckey=new byte[4];       //卡片新密钥
            byte[] mypiccserial=new byte[6];     //卡UID序列号
            boolean withkey=true;                //是否要认证卡密钥
            boolean thiscarduit =false;          //是否只操作指定卡号的卡

            if (withkey){  //本次操作需要密码验证,将认证密钥加入oldpicckey
                myctrlword=(byte)(myctrlword+NEEDKEY);
                String oldKeyhexstr="12345678";     //认证密钥
                for(int i=0;i<4;i++){
                    oldpicckey[i]=(byte)Integer.parseInt(oldKeyhexstr.substring(i*2,(i+1)*2),16);
                }
            }

            if(thiscarduit){  //本次只操作指定UID号的卡,mypiccserial
                myctrlword=(byte)(myctrlword+NEEDSERIAL);
                String Uidhexstr="000000000000";   //卡片uid
                for(int i=0;i<6;i++){
                    mypiccserial[i]=(byte)Integer.parseInt(Uidhexstr.substring(i*2,(i+1)*2),16);
                }
            }

            String newKeyhexstr="12345678";     //新密钥
            for(int i=0;i<4;i++){
                newpicckey[i]=(byte)Integer.parseInt(newKeyhexstr.substring(i*2,(i+1)*2),16);
            }

            status = CLibrary.sdtapi.t5557_changekey(myctrlword,mypiccserial,oldpicckey,newpicckey);
            if(status == 0) {
                CLibrary.sdtapi.idr_beep(38);
                String cardnohex = "";
                for (int i = 0; i < 6; i++) {
                    String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
                    cardnohex = cardnohex + bytestr.substring(bytestr.length() - 2, bytestr.length());
                }
                System.out.print("修改卡密钥成功,16进制卡序列号:" + cardnohex + "\n");
            }else {
                PrintErrInf(status);   //错误代码提示
            }
        }


    }

    //----------------------------------------------------------------------------------错误字符串代码提示
    static void PrintErrStr(String Errstr){
        if(Errstr.equals("ER08")){
            System.out.print("错误代码:ER08,未寻到卡,请重新拿开卡后再放到感应区!\n");
        } else if(Errstr.equals("ER22")){
            System.out.print("错误代码:ER22,动态库或驱动程序异常!\n");
        } else if(Errstr.equals("ER23")){
            System.out.print("错误代码:ER23,驱动程序错误或尚未安装!\n");
        } else if(Errstr.equals("ER24")){
            System.out.print("错误代码:ER24,操作超时,一般是动态库没有反映!\n");
        }else {
            System.out.print("错误代码:"+Errstr);
        }
    }

    //----------------------------------------------------------------------------------错误代码提示
    static void PrintErrInf(int errcode) {
        switch(errcode){
            case 1:
                System.out.print("错误代码:1,写入配置的值不正确,请重新写入!\n");
                break;
            case 2:
                System.out.print("错误代码:2,本卡尚未开启密码功能,函数myctrlword中无需加入NEEDKEY!\n");
                break;
            case 3:
                System.out.print("错误代码:3,需要密码才能读卡,函数myctrlword要加入NEEDKEY!\n");
                break;
            case 5:
                System.out.print("错误代码:5,密码错误!\n");
                break;
            case 8:
                System.out.print("错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!\n");
                break;
            case 21:
                System.out.print("错误代码:21,没有动态库!\n");
                break;
            case 22:
                System.out.print("错误代码:22,动态库或驱动程序异常!\n");
                break;
            case 23:
                System.out.print("错误代码:23,驱动程序错误或尚未安装!\n");
                break;
            case 24:
                System.out.print("错误代码:24,操作超时,一般是动态库没有反映!\n");
                break;
            case 25:
                System.out.print("错误代码:25,发送字数不够!\n");
                break;
            case 26:
                System.out.print("错误代码:26,发送的CRC错!\n");
                break;
            case 27:
                System.out.print("错误代码:27,接收的字数不够!\n");
                break;
            case 28:
                System.out.print("错误代码:28,接收的CRC错!\n");
                break;
            default:
                System.out.print("未知错误,错误代码:"+Integer.toString(errcode)+"\n");
                break;
        }
    }
}

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

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

相关文章

ATA-8202射频功率放大器有什么作用

射频功率放大器是一种专门用于放大射频信号功率的电子器件。它在无线通信、雷达系统、卫星通信、医疗设备和广播电视等领域中发挥着重要作用。下面安泰电子将介绍ATA-8202射频功率放大器的作用及其在不同应用领域中的具体应用。 一、ATA-8202射频功率放大器的作用 射频功率放大…

短链接day8

短链接监控 开发访问单个短链接监控统计功能 不知道是哪里复制错了&#xff0c;反正就是一顿报错&#xff0c;改了这个又改那个&#xff0c;还是报错。。暂时不管了。 记录短链接访问日志 logdo新增networt、device、local属性。 分页查询短链接访问日志 分页查询短链接今…

使用Bind提供的域名解析服务

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、DNS域名解析服务 二、安装Bind服务程序 1、正向解析 2、反向解析 三、部署从服务器 四、安全的加密传输 五、部署缓存服务器 六、分…

AI算法19-偏最小二乘法回归算法Partial Least Squares Regression | PLS

偏最小二乘法回归算法简介 算法概述 偏最小二乘法模型可分为偏最小二乘回归模型和偏最小二乘路径模型。其中偏最小二乘回归模型是一种新型的多元统计方法&#xff0c;它集中了主成分分析、典型相关分析和线性回归的特点&#xff0c;特别在解决回归中的共线性问题具有无可比拟…

在JavaScript中,什么是解构赋值(destructuring assignment)?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介在JavaScript中&#xff0c;什么是解构赋值&#xff08;destructuring assignment&#xff09;&#xff1f;1. 引言2. 解构赋值的概念3. 数组解构赋值3.1 基本语法3.2 跳过元素3.3 默认值3.4 交换变量值 4. 对象解构赋值4.1 基本语…

“解锁物流新纪元:深入探索‘沂路畅通‘分布式协作平台“

"解锁物流新纪元&#xff1a;深入探索沂路畅通分布式协作平台" 在21世纪的数字浪潮中&#xff0c;物流行业作为连接生产与消费的关键纽带&#xff0c;其重要性不言而喻。然而&#xff0c;随着市场规模的持续扩大和消费者需求的日益多样化&#xff0c;传统物流模式已…

150个pb网站模板(都是成品网站,上传php空间即可使用),建站必备

一网友提供的150个pb网站模板&#xff0c;其实就是成品网站&#xff0c;上传php空间即可使用&#xff0c;属于建站公司或者建站开发人员必备的资源。 一共150个基于pb的成品网站&#xff0c;基本上都可以找到适应你手头客户需要的一款&#xff0c;简单修改一下即可交活收钱了。…

LinuxShell编程1———shell基础命令

文章目录 前言 一、shell基础知识 1、shell概念 2、Shell的功能 接收&#xff1a;用户命令 调用&#xff1a;相应的应用程序 解释并交给&#xff1a;内核去处理 返还&#xff1a;内核处理结果 3、Shell种类&#xff08;了解&#xff09; 3.1、MS-DOS 3.2、Windows的…

图片在线怎样做二维码?制作二维码展示图片的制作方法

图片想要更快捷的分享给其他人展示&#xff0c;除了通过网站平台之外&#xff0c;比如朋友圈、qq空间、微博等方式外&#xff0c;现在很多人也会通过生成二维码的方法&#xff0c;让其他人可以通过扫描二维码查看图片。图片转换二维码的好处有很多&#xff0c;比如可以节省空间…

【C++航海王:追寻罗杰的编程之路】智能指针

目录 1 -> 为什么需要智能指针&#xff1f; 2 -> 内存泄漏 2.1 ->什么是内存泄漏&#xff0c;以及内存泄漏的危害 2.2 -> 内存泄漏分类 2.3 -> 如何避免内存泄漏 3 -> 智能指针的使用及原理 3.1 -> RAII 3.2 -> 智能指针的原理 3.3 -> std…

IDEA创建普通Java项目

环境准备 Java环境 运行javac查看java环境是否安装完成 开发工具Intellij IDEA 下载地址&#xff1a;https://www.jetbrains.com/idea/download/?sectionwindows 创建项目 点击新建项目 填入项目名字&#xff0c;项目路径&#xff0c;选择maven,点击下面的创建 运行项目 …

贪心,CF 1891C - Smilo and Monsters

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1891C - Smilo and Monsters 二、解题报告 1、思路分析 操作二显然很划算的&#xff0c;但是操作2有代价&#xff0c;为了更划算&#xff0c;我们要让操作2的操作次数最少 即&#xff0c;操作二尽可能用在…

Apollo docker-compose

来源 https://www.apolloconfig.com/#/zh/deployment/quick-start-docker 路径 /usr/apollo Sql 自己复制 Vim docker-compose.yml #如果安装过了 记得删除mysql 历史文件 rm -r /var/lib/mysql version: 2.1services:apollo-quick-start:image: nobodyiam/apollo-quick…

MongoDB教程(六):mongoDB复制副本集

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

React 速通笔记

前言 最近刚学完 React&#xff0c;想着把笔记分享给大家&#xff0c;本笔记特别适合从事后端想要学习前端的人。我看视频是黑马最新的 React 视频&#xff08;黑马程序员前端React18入门到实战视频教程&#xff0c;从reacthooks核心基础到企业级项目开发实战&#xff08;B站评…

Windows 2012安装之实现远程连接

新建虚拟机 点击稍后安装操作系统 点击Microsoft Windows(W) 选择Windows Server 2012 设置虚拟机名称、安装位置 选择你的电脑核数 点击编辑虚拟机设置 点击CD/DVD(SATA) 使用ISO映像文件(M) 配置完之后点击确定 然后开启虚拟机 下一步&#xff1a; 点击现在安装&#xff1a…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889驱动大屏_硬件SPI4_参考代码(v1.3)

单片机实际不限&#xff0c;这里采用的STC最新、主推的型号&#xff0c;比如STC8H8K64U、STC8051U34K64进行实验测试&#xff0c;您可以换用不同型号。目前测试这两个系列&#xff0c;显示速度均相当不错&#xff0c;软件设计也是极为简单。各篇文章下方均提供源码供参考下载。…

Java 反射用法和8道练习题

目录 一、什么是反射二、反射的核心接口和类三、测试代码 Bean 类和目录结构Person 类代码目录结构 四、获取 Class 对象五、获取构造方法 Constructor 并使用六、获取成员变量 Field 并使用七、获取成员方法 Method 并使用八、练习1. 使用反射获取String类的所有公有方法&…

在python里构建你的投资组合portfolio--最好用的pandas零基础

有人可能觉得软件数据分析门槛很高&#xff0c;自学也坚持不下来&#xff0c; 其实分解成一个小的功能和任务&#xff0c;对零基础自学者非常有帮助。 今天用python中最好用的数据分析包pandas为例&#xff1a; 用最简单的代码完成全流程 构建投资组合 → 获取数据 → 进行分…

均匀性大于98%均匀光源积分球

在光学技术的浩瀚星空中&#xff0c;均匀光源积分球犹如一颗璀璨的明珠&#xff0c;以其卓越的均匀性能&#xff0c;照亮了科研、检测、照明等多个领域的探索之路。当谈及均匀性超过98%的积分球时&#xff0c;我们不禁要深入其内部&#xff0c;探索这一科技奇迹背后的原理与应用…