mifare one卡芯片怎么加密?

最近在研究ic卡全加密,但是不知道M1卡芯片怎么加密? 日常使用的普通ic卡的芯片已经被加密了吗?
希望有高手能够作答。

1个回答

芯片加密的过程是在芯片卡上的芯片进行的,用的是aes算法。
日常使用就很难说了,有的保持了出厂密码,有的密码很简单容易猜举出来,有的通过反向工程程序可以解密。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
mifare Ic卡俗称M1卡的密码验证问题
最近调式M1,得到UID,选择指令都成功。然后进入三次验证时一直不成功 新卡KEYA,KEYB都是默认密码,用的AS3911进入调式,各位弄个的兄弟,来看看,帮帮我,也看看大家。
安卓开发中可以用NfcA类来操作Mifare Classic卡吗???
测试机型Nexus5 问题1:Mifare Classic卡被手机认成NfcA标签,NfcA类关于IO的只有一个transceive函数。可以用这个函数对卡进行操作吗???
安卓NFC开发中能否用NfcA类来对Mifare Classic卡操作??
测试机型:Nexus5 问题:因为手机用的不是NXP的方案,不支持MifareClassic卡,但是NfcA和Mifare的标准是一样的,所以猜测能否这样做?有大神可以指教下吗?
rfid卡读卡器到底是通过什么来判定卡片的商家
rfid卡读卡器到底是通过什么来判定卡片的商家,如:nxp,复旦微? rFID卡读卡器到底是通过什么来判定卡的类型?如nxp:70卡、50卡、Mifare UltraLight卡、Mifare Light卡……?????
MFRC522 对Mifare1 S50卡控制块的读写操作
求高手解答,我用MFRC522可以读写Mifare1 S50的数据块,但是无法对控制块的读写。比如对于控制块的控制字节,任何情况下只需要验证密码A即可,但是每次的读取都是16字节,且读出的控制块内容全部为0,该如何操作是好!!! 比如我想读取或者写入扇区1、块3的控制字节,该如何操作。
我想制作一个电子阅读器用stm32f103rct6,求住制作流程,网上有一个,不是很懂求指教
这是我从网上down的方法,有点不懂,关键就是编程还有MF RC522模块设计,求大虾指教,谢谢 1 硬件设计 1.1 硬件结构设计 RFID阅读器基于STM32单片机设计,芯片型号选择为STM32F103RBT6。该芯片为LQFP64封装, 内部有128 KB Flash和20 KB RAM,采用32位的ARM CortexTM-M3内核, 最高支持主频72 MHz,拥有2个SPI接口、 2个USART接口、1个USB接口、2个I2C接口和7个定时器。支持SWD和JTAG调试模式及IAP和ISP编程。 STM32单片机支持J-Link在线调试,J-Link调试有两种模式:JTAG调试和SWD调试。在线调试的便捷性,可以极大缩短程序的开发周期,提高开发效率。本系统采用的调试模式为SWD模式,只需2根SWDIO和SWCLK信号线,相比JTAG模式更加节约I/O口资源。阅读器的硬件结构框图如图1所示。 1.2 电源模块设计 系统可使用直流电源或电池供电,外部直流电源电压为8.4 V;电池电压为7.2 V,2 600 mA/h的锂电池。电源模块设计原理图如图2所示。 电源模块工作原理:当插座J1连接外部直流电源时,电流可经过D4给电池充电,直流电源经开关JP1连接IRF7404的G极,使IRF7404的D极与S极断开,则系统使用外部直流电源供电;当不使用直流电源、按下开关时,D4可将CD_POWER与电池断开,IRF7404的G极为低电平, IRF7404导通, 则系统使用电池供电。SYS_ POWER电压经过LM2576S-3.3转换为3.3 V为系统的各模块供电。 1.3 MF RC522模块设计 MF RC522是阅读器的读卡芯片,工作频率为13.56 MHz,工作模式支持ISO 14443A标准,芯片内部驱动器可以直接驱动阅读器的天线,无需其他电路。MF RC522具有3种接口模式:SPI接口模式、UART模式和I2C总线模式[3]。其中SPI模式的通信速度最快,可达到10 Mb/s。 MF RC522与主机接口模式有关的两个引脚为IIC和EA:当IIC引脚拉高时,表示当前模式为I2C模式,若IIC引脚为低电平时,再通过EA引脚电平来区分。EA为高电平时,表示SPI模式;为低电平时,则表示UART模式[4]。本设计中MF RC522与MCU采用SPI通信,与AT45DB161共享一个MCU的SPI2接口。 在系统中,MF RC522和天线电路一起作为单独模块使用,以便于更换与维修。天线模块与主板之间通过插座连接。 天线是阅读器中的一个重要组成部分。其作用是向外发射一组固定频率的电磁波,为射频卡提供能量、传递数据。 本系统中使用的是PCB天线,天线的设计关系到阅读器的读写距离,甚至关系到阅读器是否能正常与射频卡通信。RC522的天线设计须注意以下两点:(1)为了让射频卡能获取足够大的能量驱动本身的集成电路,设计天线时应该保证向外辐射足够大的电磁波; (2)为了提高读卡数据的准确性,需要考虑调谐电路的通频带,确保调制信号的准确性。 天线的匹配电路可分为:天线线圈、LC谐振电路和EMC滤波电路。RC522的天线匹配电路如图3所示,其中RQ为品质因素Q的匹配电阻,Lant为天线的电感。 1.4 显示模块设计 阅读器选用2.8英寸的TFT LCD触摸屏。在本系统中移植了GUI模块,使得人机交流界面操作更加便捷、友善。触摸屏为四线电阻屏,使用ADS7843作为A/D转换芯片。ADS7843是内置12位模/数转换、低导通电阻模拟开关的串行接口芯片,模/数转换输出范围0~4 095,工作电压2.7 V~5 V,参考电压VREF为1 V~VCC,转换电压的输入范围为0~VREF,最高转换速率为125 kHz[5]。ADS7843与MCU的接口为SPI1。 驱动层的程序基于硬件平台,主要是为中间服务层提供硬件驱动接口函数,完成底层的硬件操作。编写STM32的内部资源驱动程序时,调用了ST公司的固件库函数。 中间服务层主要是为上层应用程序提供库支持和服务接口。中间服务层的程序在驱动层程序上开发,并封装驱动程序的接口。如FATS文件系统是在AT45DB161的驱动程序上移植,为上层的应用程序提供文件创建、写入、读出、删除等服务;GUI模块是在LCD显示驱动程序上开发,将LCD驱动的画点画线函数封装成不同的控件,在控件上加载相应的数据结构,为界面应用程序提供控件的创建、销毁等操作。 应用层程序是面向用户,通过调用中间服务函数和库函数来完成相应的数据处理和控制功能等。 2.2 Free RTOS实时操作系统 Free RTOS是一个轻量级的操作系统,基本满足较小系统的需要。该操作系统完全免费且源码公开,同时具有可移植、可裁减、调度策略灵活的特点。 在本设计中Free RTOS的任务之间的关系如图5所示。 2.3 GUI模块 GUI模块是一个中间服务层程序,为显示应用程序提供控件显示服务。如控件的显示位置、尺寸、颜色以及控件响应的回调函数入口地址等。在本系统中GUI控件包含有文本框、编辑框、进度条、图像框、下拉列表、按钮等。每个控件都可以注册一个回调函数,这个函数对应了该控件的响应功能函数。 2.4 FAT文件系统 FatFs文件系统是中间服务层程序,建立在AT45DB161驱动程序上,文件系统提供了磁盘I/O接口和应用程序接口。磁盘I/O接口函数位于diskio.c文件,常用的接口函数有读磁盘disk_read()和写磁盘disk_write()。这两个函数分别调用AT45DB161驱动程序的读扇区和写扇区函数。在文件系统中一个扇区的大小为512 B,与AT45DB161的页大小一致。 为了使FatFs文件系统与Windows的文件系统兼容,要使用FAT32格式来格式化磁盘。f_open()函数与f_close()函数必须要成对出现,即打开一个文件操作完成后必须要关闭这个文件。在对文件进行操作前必须先调用f_mount(0,&Fs)函数对工作区进行注册,操作完成后也需要调用f_mount(0,NULL)函数对工作区进行注销。 2.5 MF RC522驱动程序流程 本系统中使用的射频卡为Mifare1 S50,也简称为M1卡,该卡有16个扇区,每个扇区有4个块,每个块可存储16 B的数据。MF RC522对M1卡进行读写控制,分别有寻卡、防碰撞、选卡、认证、读块和写块等过程。 MF RC522驱动程序流程如下: (1)寻卡:寻找感应区内所有符合ISO14443A标准的卡,寻卡成功后,返回卡的类型。 (2)防碰撞:通过防碰撞命令查看多张M1卡之间是否发生碰撞,若发生碰撞,使用防碰撞算法进行处理;若未发生碰撞,则MF RC522与M1卡进行通信,如果通信成功,读出M1卡中的序列号。 (3)选卡:根据M1卡的序列号进行选卡。 (4)密码验证:密码验证模式有验证A密钥和验证B密钥,通过这两种模式来验证块地址、密码和卡片序列号。 (5)读数据块:根据提供的块地址读取块数据。 (6)写数据块:根据提供的块地址写入块数据,操作完成后命令M1卡进入休眠状态。 2.6 AT45DB161D驱动程序 AT45DB161D是一个外部Flash存储器,拥有2 MB的容量,分为4 096个页,可配置为每页512 B,还拥有2个512 B的缓冲区。在主存储器正在编程时,缓冲区允许接收数据,且支持数据流式写入。AT45DB161的初始化包括STM32的引脚配置和SPI2接口配置,初始化之后才能进行读写操作。读写页操作流程如下: (1)读页操作流程 ①检测AT45芯片是否忙。若忙,则继续读忙,直到芯片空闲;若芯片空闲,则执行流程②。 ②向AT45芯片写入命令0x53和页地址。0x53命令是将Flash中整页的数据读到缓冲区1中。 ③向AT45芯片写入命令0xD4和页偏移地址及数据长度。0xD4命令是读缓冲区1中的数据。 ④读页操作完成。 (2)写页操作流程 ①检测AT45芯片是否忙。若忙,则继续读忙,直到芯片空闲;若芯片空闲,则执行流程②。 ②向AT45芯片写入命令0x84、页偏移地址及需要写入的数据。0x84命令是将数据写到缓冲区1中。 ③向AT45芯片写入命令0x83和页地址。0x83命令是将缓冲区1中的数据写到Flash指定的页。使用0x83命令,写入前不需要对页进行擦除操作。 ④写页操作完成。 3 性能测试与实验分析 3.1手持式阅读器的功能测试 需要测试的功能有对M1卡读写、文件读写、与PC机数据通信等功能。为了便于测试上述功能,将本设计应用在校园消费系统上进行测试。测试步骤如下: (1)用串口线将RFID阅读器与PC机相连。运行PC机的上位机程序,设置串口参数为:波特率9 600 b/s,数据位8 bit,停止位1 bit,无校验位,无流控制。 (2)对M1卡读写功能测试。通过上位机软件发送指令和数据至阅读器,阅读器将指定数据写入M1卡。然后再将M1卡数据读出,传回给上位机软件显示,并比较写入数据和读出数据,如图6所示。 (3)文件读写测试。由于读M1卡的数据以文件的形式存放在阅读器的外部Flash中,该Flash由文件系统管理。用USB线连接阅读器和PC机,阅读器以盘符的形式在PC机上显示,从磁盘中将文件复制到PC机上,用上位机软件打开读出软件,记录测试数据。 (4)与PC机数据通信测试。以上两项测试通过则表明阅读器能与PC机进行正常通信。 3.2 性能测试与分析 系统的性能测试主要是锂电池的续航时间及RFID有效读卡距离等。系统性能测试如表1所示。 (1)锂电池的续航时间需要分别测试最长待机时间和连续工作时间。 ①最长待机时间测试:将锂电池充满电,阅读器使用电池供电,将阅读器开机而不使用,记录待机时间。 ②连续工作时间测试:将锂电池充满电,阅读器使用电池供电,编写一个测试程序,让阅读器定时每30 s读取M1卡信息。记录工作时间。 ③用万用表分别测量阅读器的待机消耗电流和工作消耗电流,并记录电流值。 (2)RFID有效读卡距离。将阅读器固定不动,M1卡平行放在阅读器天线平面的正上方200 mm处,将M1卡缓慢向阅读器移动,直到阅读器能正确读取M1卡中数据为止。测量卡与阅读器天线之间的距离并记录数据。 通过对上述的系统功能、性能进行验证,分析实验测出的相应数据,系统的功能基本能达到了初期预设的技术指标。 本文设计的阅读器有良好的人机交流界面,可通过触控操作,显示屏可显示M1卡中存储信息。经过实验证明,在70 mm的范围内能准确读写M1卡中的数据。该阅读器具有超长待机和低功耗的功能。经过实际功能测试,已成功地将该设计应用于校园消费系统。 专注
关于arduino怎么连接两个RFID模块的问题
毕业设计我要做一个基于rfid的巡更系统,为此我要连接至少两个的RFID读写模块。 但网上的示例都是只用一个的,引脚的插得位置也是一样的,我不太清楚引脚都是怎么定义的。 我用的是mfrc522的模块。 以下面代码为例,我只知道#define RST_PIN 9 和#define SS_PIN 10 是定义RST和SS引脚的,但剩下的SCK MOSI MISO 是怎么定义的。本来我以为剩下的是可以公用的,就用一个面包板连接起来,但发现不行。 现在可能是要定义这些的引脚,但我不知道哪部分代码是定义这些引脚的。 求大神指点一下。 ``` #include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 // 可配置,见典型引脚布局以上 #define SS_PIN 10 // Configurable, see typical pin layout above MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance /* Set your new UID here! */ #define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); // Initialize serial communications with the PC 初始化与PC串行通信 while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) 如果没有串口打开,什么也不做(添加基于atmega32u4 Arduinos) SPI.begin(); // Init SPI bus 初始化SPI总线 mfrc522.PCD_Init(); // Init MFRC522 card Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!")); //警告:这个例子改写你的UID变卡UID,小心使用! // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory. 准备关键所有按键都设置在芯片ffffffffffff H从工厂交货。 for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } // Setting the UID can be as simple as this: 设置UID可以这么简单: //void loop() { // byte newUid[] = NEW_UID; // if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { // Serial.println("Wrote new UID to card."); // } // delay(1000); //} // But of course this is a more proper approach 当然,这是一个更恰当的方法 void loop() { // Look for new cards, and select one if present 寻找新卡,并选择一个如果存在 if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { delay(50); return; } // Now a card is selected. The UID and SAK is in mfrc522.uid.现在选择卡片。UID和SAK是mfrc522.uid。 // Dump UID转储的UID Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Dump PICC type 转为PICC类型 // MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); // Serial.print(F("PICC type: ")); // Serial.print(mfrc522.PICC_GetTypeName(piccType)); // Serial.print(F(" (SAK ")); // Serial.print(mfrc522.uid.sak); // Serial.print(")\r\n"); // if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI // && piccType != MFRC522::PICC_TYPE_MIFARE_1K // && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { // Serial.println(F("This sample only works with MIFARE Classic cards.")); // return; // } // Set new UID 设置新的UID byte newUid[] = NEW_UID; if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn't get confused / /停止PICC和重新选择那么DumpToSerial不混乱 mfrc522.PICC_HaltA(); if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { return; } // Dump the new memory contents 转为新的内容储存 Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); } ```
使用RC522写入block 0,写特殊指令0x40和0x43时超时。
使用树莓派SPI驱动RC522模块,读取block 0数据成功,但是写入block 0失败。参照网上资料,写入block 0前需要先写入两个特殊指令0x40和0x43,但是当我通过调用函数 ``` MFRC522_WriteReg(BitFramingReg, 0x07) MFRC522_ToCard(PCD_TRANSCEIVE, 0x40) //0x40 MFRC522_WriteReg(BitFramingReg, 0x00) MFRC522_ToCard(PCD_TRANSCEIVE, 0x43) //0x43 ``` 写入这两个命令时总是报错超时失败。但是其他request,select等流程调用 这两个函数都能成功,是在不知哪里有问题。怀疑是不是买的卡片不支持写入block 0,但是买的时候确实说是支持的。 下面是具体代码: ``` RC522.py: import RPi.GPIO as GPIO import spi import signal import time class MFRC522: PCD_IDLE = 0x00 # cancel current command PCD_AUTHENT = 0x0E # authent PCD_RECEIVE = 0x08 # receive data PCD_TRANSMIT = 0x04 # send data PCD_TRANSCEIVE = 0x0C # send & receive data PCD_RESETPHASE = 0x0F # reset PCD_CALCCRC = 0x03 # CRC calculate PICC_REQIDL = 0x26 # detect cards, not slepp PICC_REQALL = 0x52 # detect cards, all PICC_ANTICOLL = 0x93 # anti collision PICC_SElECTTAG = 0x93 # select card PICC_AUTHENT1A = 0x60 # authent A PICC_AUTHENT1B = 0x61 # authent B PICC_READ = 0x30 # read block PICC_WRITE = 0xA0 # write block PICC_DECREMENT = 0xC0 # dec money PICC_INCREMENT = 0xC1 # inc money PICC_RESTORE = 0xC2 # send data to buf PICC_TRANSFER = 0xB0 # save date from buf PICC_HALT = 0x50 # idle status Reserved00 = 0x00 # register CommandReg = 0x01 CommIEnReg = 0x02 DivlEnReg = 0x03 CommIrqReg = 0x04 DivIrqReg = 0x05 ErrorReg = 0x06 Status1Reg = 0x07 Status2Reg = 0x08 FIFODataReg = 0x09 FIFOLevelReg = 0x0A WaterLevelReg = 0x0B ControlReg = 0x0C BitFramingReg = 0x0D CollReg = 0x0E Reserved01 = 0x0F Reserved10 = 0x10 ModeReg = 0x11 TxModeReg = 0x12 RxModeReg = 0x13 TxControlReg = 0x14 TxAutoReg = 0x15 TxSelReg = 0x16 RxSelReg = 0x17 RxThresholdReg = 0x18 DemodReg = 0x19 Reserved11 = 0x1A Reserved12 = 0x1B MifareReg = 0x1C Reserved13 = 0x1D Reserved14 = 0x1E SerialSpeedReg = 0x1F Reserved20 = 0x20 CRCResultRegM = 0x21 CRCResultRegL = 0x22 Reserved21 = 0x23 ModWidthReg = 0x24 Reserved22 = 0x25 RFCfgReg = 0x26 GsNReg = 0x27 CWGsPReg = 0x28 ModGsPReg = 0x29 TModeReg = 0x2A TPrescalerReg = 0x2B TReloadRegH = 0x2C TReloadRegL = 0x2D TCounterValueRegH = 0x2E TCounterValueRegL = 0x2F Reserved30 = 0x30 TestSel1Reg = 0x31 TestSel2Reg = 0x32 TestPinEnReg = 0x33 TestPinValueReg = 0x34 TestBusReg = 0x35 AutoTestReg = 0x36 VersionReg = 0x37 AnalogTestReg = 0x38 TestDAC1Reg = 0x39 TestDAC2Reg = 0x3A TestADCReg = 0x3B Reserved31 = 0x3C Reserved32 = 0x3D Reserved33 = 0x3E Reserved34 = 0x3F NRSTPD = 22 MAX_LEN = 18 MI_OK = 0 MI_NOTAGERR = 1 MI_ERR = 2 MI_TIMEOUT = 3 def __init__(self, dev='/dev/spidev0.0', spd=1000000): self.dev0 = spi.openSPI(device=dev, speed=spd) GPIO.setmode(GPIO.BOARD) GPIO.setup(self.NRSTPD, GPIO.OUT) GPIO.output(self.NRSTPD, 1) self.MFRC522_Init() def MFRC522_WriteReg(self, addr, val): spi.transfer(self.dev0, ((addr<<1)&0x7E, val)) def MFRC522_ReadReg(self, addr): val = spi.transfer(self.dev0, (((addr<<1)&0x7E) | 0x80, 0)) return val[1] def MFRC522_SetRegBitMask(self, reg, mask): tmp = self.MFRC522_ReadReg(reg) self.MFRC522_WriteReg(reg, tmp | mask) def MFRC522_ClearRegBitMask(self, reg, mask): tmp = self.MFRC522_ReadReg(reg) self.MFRC522_WriteReg(reg, tmp & (~mask)) def MFRC522_ToCard(self, command, sendData): retStatus = self.MI_OK backData = [] backLen = 0 irqEn = 0x00 waitIRq = 0x00 lastBits = None n = 0 i = 0 if command == self.PCD_AUTHENT: irqEn = 0x12 waitIRq = 0x10 if command == self.PCD_TRANSCEIVE: irqEn = 0x77 waitIRq = 0x30 self.MFRC522_WriteReg(self.CommIEnReg, irqEn|0x80) # enable interupt self.MFRC522_ClearRegBitMask(self.CommIrqReg, 0x80) # clear interupt flags self.MFRC522_SetRegBitMask(self.FIFOLevelReg, 0x80) # init FIFO self.MFRC522_WriteReg(self.CommandReg, self.PCD_IDLE) # cancel current command for i in range(len(sendData)): self.MFRC522_WriteReg(self.FIFODataReg, sendData[i]) self.MFRC522_WriteReg(self.CommandReg, command) if command == self.PCD_TRANSCEIVE: self.MFRC522_SetRegBitMask(self.BitFramingReg, 0x80) i = 2000 while True: n = self.MFRC522_ReadReg(self.CommIrqReg) i -= 1 if ~((i!=0) and ~(n&0x01) and ~(n&waitIRq)): break self.MFRC522_ClearRegBitMask(self.BitFramingReg, 0x80) if i != 0: if (self.MFRC522_ReadReg(self.ErrorReg) & 0x1B) == 0x00: if n & irqEn & 0x01: retStatus = self.MI_NOTAGERR if command == self.PCD_TRANSCEIVE: n = self.MFRC522_ReadReg(self.FIFOLevelReg) lastBits = self.MFRC522_ReadReg(self.ControlReg) & 0x07 if lastBits != 0: backLen = (n-1)*8 + lastBits else: backLen = n*8 if n == 0: n = 1 if n > self.MAX_LEN: n = self.MAX_LEN for i in range(n): backData.append(self.MFRC522_ReadReg(self.FIFODataReg)) else: retStatus = self.MI_ERR else: retStatus = self.MI_TIMEOUT return (retStatus, backData, backLen) def _CalulateCRC(self, indata): self.MFRC522_ClearRegBitMask(self.DivIrqReg, 0x04) self.MFRC522_SetRegBitMask(self.FIFOLevelReg, 0x80) for i in range(len(indata)): self.MFRC522_WriteReg(self.FIFODataReg, indata[i]) self.MFRC522_WriteReg(self.CommandReg, self.PCD_CALCCRC) i = 255 while True: n = self.MFRC522_ReadReg(self.DivIrqReg) i -= 1 if ~((i != 0) and ~(n&0x04)): break crc = [] crc.append(self.MFRC522_ReadReg(self.CRCResultRegL)) crc.append(self.MFRC522_ReadReg(self.CRCResultRegM)) return crc # function : read block # parameter : blockAddr(0~63) # return : retStatus # backData[16] def MFRC522_ReadBolock(self, blockAddr): retStatus = self.MI_OK # cmd: 0x0c # buf: 0x30 blockAddr crc[2] buf = [] buf.append(self.PICC_READ) buf.append(blockAddr) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 8*self.MAX_LEN): retStatus = self.MI_ERR return (retStatus, backData) # function : write block # parameter : blockAddr(0~63) # writeData[16] # return : retStatus def MFRC522_WriteBlock(self, blockAddr, writeData): retStatus = self.MI_OK # cmd: 0x0c # buf: 0xA0 blockAddr crc[2] buf = [] buf.append(self.PICC_WRITE) buf.append(blockAddr) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or ((backData[0]&0x0F) != 0x0A) or (backLen != 4): retStatus = self.MI_ERR if status == self.MI_OK: # cmd: 0x0c # buf: writeData[16] crc[2] buf2 = [] for i in range(16): buf2.append(writeData[i]) crc = self._CalulateCRC(buf2) buf2.append(crc[0]) buf2.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf2) if (status != self.MI_OK) or ((backData[0]&0x0F) != 0x0A) or (backLen != 4): retStatus = self.MI_ERR return retStatus def MFRC522_Init(self): self.MFRC522_Reset() self.MFRC522_WriteReg(self.TModeReg, 0x8D) self.MFRC522_WriteReg(self.TPrescalerReg, 0x3E) self.MFRC522_WriteReg(self.TReloadRegL, 30) self.MFRC522_WriteReg(self.TReloadRegH, 0) self.MFRC522_WriteReg(self.TxAutoReg, 0x40) self.MFRC522_WriteReg(self.ModeReg, 0x3D) self.MFRC522_AntennaOn() def MFRC522_Reset(self): # reg: 0x01 # buf: 0x0F self.MFRC522_WriteReg(self.CommandReg, self.PCD_RESETPHASE) def MFRC522_AntennaOn(self): # reg: 0x14 # buf: 0bxxxxxx11 temp = self.MFRC522_ReadReg(self.TxControlReg) if not(temp & 0x03): self.MFRC522_SetRegBitMask(self.TxControlReg, 0x03) def MFRC522_AntennaOff(self): # reg: 0x14 # buf: 0bxxxxxx00 self.MFRC522_ClearRegBitMask(self.TxControlReg, 0x03) # function : detect card # parameter : reqMode: detect mode # 0x52 = detect all cards # 0x26 = detect not sleep cards # return : retStatus # backData: card type, 2 bytes # 0x4400 = Mifare_UltraLight # 0x0400 = Mifare_One(S50) # 0x0200 = Mifare_One(S70) # 0x0800 = Mifare_Pro(X) # 0x4403 = Mifare_DESFire def MFRC522_Request(self, reqMode): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x07) # cmd: 0x0c # buf: 0x26/0x52 buf = [] buf.append(reqMode) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 0x10): retStatus = self.MI_ERR return (retStatus, backData) # function : anticoll # parameter : # return : retStatus # backData(Uid, 4 bytes) def MFRC522_Anticoll(self): retStatus = self.MI_OK serNumCheck = 0 self.MFRC522_WriteReg(self.BitFramingReg, 0x00) # cmd: 0x0c # buf: 0x93 0x20 buf = [] buf.append(self.PICC_ANTICOLL) buf.append(0x20) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status==self.MI_OK) and (len(backData)==5): for i in range(4): serNumCheck ^= backData[i] if serNumCheck != backData[4]: retStatus = self.MI_ERR else: retStatus = self.MI_ERR return (retStatus, backData) # function : select card # parameter : Uid # return : retStatus def MFRC522_Select(self, Uid): retStatus = self.MI_OK serNumCheck = 0 # cmd: 0x0c # buf: 0x93 0x70 Uid[4] check crc[2] buf = [] buf.append(self.PICC_SElECTTAG) buf.append(0x70) for i in range(4): buf.append(Uid[i]) serNumCheck ^= Uid[i] buf.append(serNumCheck) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 0x18): retStatus = self.MI_ERR return retStatus # function : auth sectorkey # parameter : authMode(PICC_AUTHENT1A/PICC_AUTHENT1B) # blockAddr # sectorkey(6 bytes) # Uid(4 bytes) # return : retStatus def MFRC522_Auth(self, authMode, blockAddr, sectorkey, Uid): retStatus = self.MI_OK # cmd: 0x0e # buf: authMode blockAddr sectorkey[6] Uid[4] buf = [] buf.append(authMode) buf.append(blockAddr) for i in range(6): buf.append(sectorkey[i]) for i in range(4): buf.append(Uid[i]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT, buf) if (status != self.MI_OK) or not(self.MFRC522_ReadReg(self.Status2Reg)&0x08): retStatus = self.MI_ERR return retStatus # function : idle # parameter : # return : retStatus def MFRC522_Halt(self): retStatus = self.MI_OK # cmd: 0x0c # buf: 0x50 0x00 crc[2] buf = [] buf.append(self.PICC_HALT) buf.append(0) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) retStatus = status return retStatus def MFRC522_WriteCmd40(self): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x07) # cmd: 0x0c # buf: 0x40 buf = [] buf.append(0x40) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backData[0] != 0x0a): retStatus = status return retStatus def MFRC522_WriteCmd43(self): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x00) # cmd: 0x0c # buf: 0x43 buf = [] buf.append(0x43) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backData[0] != 0x0a): retStatus = status return retStatus def MFRC522_StopCrypto1(self): self.MFRC522_ClearRegBitMask(self.Status2Reg, 0x08) def MFRC522_CloseSPI(self): spi.closeSPI(self.dev0) main.py: import RPi.GPIO as GPIO import MFRC522 import signal rc = MFRC522.MFRC522() dataBlock0 = [0x65, 0xa0, 0x8a, 0xe1, 0xae, 0x08, 0x04, 0x00, 0x01, 0x69, 0x21, 0x1a, 0x3c, 0xeb, 0xa9, 0x1d] sectorkey = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff] def read_block0(): (status, tagType) = rc.MFRC522_Request(rc.PICC_REQIDL) if status != rc.MI_OK: print("MFRC522_Request error") return print("MFRC522_Request success, tagType: %#x %#x" %(tagType[0], tagType[1])) (status, Uid) = rc.MFRC522_Anticoll() if status != rc.MI_OK: print("MFRC522_Anticoll error") return print("MFRC522_Anticoll success, Uid: %#x %#x %#x %#x" %(Uid[0], Uid[1], Uid[2], Uid[3])) status = rc.MFRC522_Select(Uid) if status != rc.MI_OK: print("MFRC522_Select error") return print("MFRC522_Select success") status = rc.MFRC522_Auth(rc.PICC_AUTHENT1A, 1, sectorkey, Uid) if status != rc.MI_OK: print("MFRC522_Auth error") return print("MFRC522_Auth success") (status, dataBlock0) = rc.MFRC522_ReadBolock(0) if status != rc.MI_OK: print("MFRC522_ReadBolock error") return print("MFRC522_ReadBolock success, block0: %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x" %(dataBlock0[0], dataBlock0[1], dataBlock0[2], dataBlock0[3], dataBlock0[4], dataBlock0[5], dataBlock0[6], dataBlock0[7], dataBlock0[8], dataBlock0[9], dataBlock0[10], dataBlock0[11], dataBlock0[12], dataBlock0[13], dataBlock0[14], dataBlock0[15])) rc.MFRC522_StopCrypto1() def write_block0(): (status, tagType) = rc.MFRC522_Request(rc.PICC_REQIDL) if status != rc.MI_OK: print("MFRC522_Request error") return print("MFRC522_Request success, tagType: %#x %#x" %(tagType[0], tagType[1])) (status, Uid) = rc.MFRC522_Anticoll() if status != rc.MI_OK: print("MFRC522_Anticoll error") return print("MFRC522_Anticoll success, Uid: %#x %#x %#x %#x" %(Uid[0], Uid[1], Uid[2], Uid[3])) status = rc.MFRC522_Select(Uid) if status != rc.MI_OK: print("MFRC522_Select error") return print("MFRC522_Select success") status = rc.MFRC522_Halt() print("MFRC522_Halt %d" %status) status = rc.MFRC522_WriteCmd40() if (status != rc.MI_OK): print("MFRC522_ToCard 0x40 error, status:%d" %status) return print("MFRC522_ToCard 0x40 success") status = rc.MFRC522_WriteCmd43() if (status != rc.MI_OK): print("MFRC522_ToCard 0x43 error, status:%d" %status) return print("MFRC522_ToCard 0x43 success") status = rc.MFRC522_WriteBlock(0, dataBlock0) if status != rc.MI_OK: print("MFRC522_WriteBlock error") return print("MFRC522_WriteBlock success") rc.MFRC522_StopCrypto1() def closeSPI(): rc.MFRC522_CloseSPI() if __name__ == '__main__': while True: action = input("Enter action r/w: ") if action == 'r': read_block0() elif action == 'w': write_block0() elif action == 'q': closeSPI() break print("exit procedure") ``` 下面是执行解过,读取成功,但是写入报错超时: ![图片说明](https://img-ask.csdn.net/upload/201910/28/1572228464_990828.png)
想问mifare协议下几个byte的含义
![图片说明](https://img-ask.csdn.net/upload/201901/05/1546659991_722466.png) 如图框住的几个byte,想知道指令含义以及说明文档是哪个
在使用mfcuk出现的问题
mfcuk - 0.3.8 Mifare Classic DarkSide Key Recovery Tool - 0.3 by Andrei Costin, zveriu@gmail.com, http://andreicostin.com WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_skgt.mfd' WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_ratb.mfd' WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_oyster.mfd' INFO: Connected to NFC reader: ACS / ACR122U PICC Interface mfcuk: ERROR: connecting to MIFARE Classic tag mfcuk: ERROR: selecting tag on the reader ACS / ACR122U PICC Interface 我用的设备是acr122-a9
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
前端 | 2. 正则
转载请注明以下: 本文转自清自以敬的博客:https://blog.csdn.net/qq_45791147 文章目录1.转义2.正则表达式初步2.1.匹配字符2.1.1.组成元素2.1.2.基础正则的设计 1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转义...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
Docker 从入门到掉坑
Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器。但是docker本身和虚拟机还是有较为明显的出入的。我大致归纳了一下,可以总结为以下几点: docker自身也有着很多的优点,关于它的优点,可以总结为以下几项: 安装docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Doc...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
金山办公上市,雷军心愿了却!
作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 11月17日,大周末的,雷军微博发了个重磅消息: “明天将是里程碑式的一天,金山办公终于成功在科创板挂牌上市了! 从1988年金山创办到今天,WPS走了整整31年。 从1999年以金山办公为主体准备上市算起,这一天,我们等了20年。 WPS和金山的历程,这是一个坚持梦想并最终取得胜利的励志故事。期待大家的祝福!”...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
17张图带你解析红黑树的原理!保证你能看懂!
二叉查找树 由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任意结点的...
腾讯“疯狂”开源!
作者 | 马超 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 近日,腾讯自研的万亿级分布式消息中间件TubeMQ正式开源,并捐赠给Apache基金会,成为基金会官方认可的Incubator项目。 我们知道与TubeMQ功能类似的kafka是领英公司在早在10年前捐赠给Apache基金会的金牌项目,而那时的腾讯还在忙于3Q大战,公司文化也相对封闭,甚至连目前社交领...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
MySQL数据库总结
一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。 关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。 主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问