虛位密碼 是一個頗有意思的功能,不知道何時開始變成了智能鎖的標配功能之一。ios
虛位密碼的意思是你輸入的密碼位數不固定,可是隻要你輸入的密碼有你當初設定的密碼,那麼就認爲是正確的;反之就是錯誤的。算法
虛位密碼功能在C++ 或者 Java中最相似的應該是String類裏面查找+比較功能。oop
這裏僅僅用最簡單的算法來進行實現,不求特別複雜的實現。測試
不少的時候工程裏面要取捨 實現的質量(從效率和佔用來衡量) 和 實現的速度(編碼的時間。Java之因此流行就是由於他的編碼速度比較快【一次編譯,到處運行】,雖然Java面向對象實現的不是那麼完美)。ui
這裏扯遠了。本次只實現兩個版本的代碼:標準C++(運行平臺:PC) 和 嵌入式C++(Arduino用的C++)編碼
對於給定的字符串 s,咱們首先獲取其的首字符 c,以後再用戶輸入的字符串 p中,去尋找 c所在的位置,再從c所在的位置切取長度與 給定的字符串s 同樣的字符串,進行比較(C語言裏面加起來減的比較),若比較結果爲0,則認爲找到該串,返回成功的結果;反之,若是爲能在給定的區域找到給定的字符串,即搜索的位置已達末尾,以及分割出來的子串長度已經小於給定的字符串長度,則認爲失敗,返回失敗的結果。spa
成功:true,找到類似的字符串code
失敗:false,未找到類似的字符串對象
下面是一個標準C++的實現,C++版本爲11blog
1 #include<string> 2 #include <iostream> 3 4 int main() 5 { 6 int findlength = 0; //尋找的長度 7 bool isOK = false; //找到了就是true 8 std::string passwd = "218519"; //原始密碼 9 std::string userinputpasswd; 10 std::cout << "請輸入密碼:"; 11 std::cin >> userinputpasswd; 12 while (findlength < userinputpasswd.size()) 13 { 14 if (findlength != 0)//非首次搜索跳過已搜索的位置,不然會陷入死循環。 15 { 16 findlength++; 17 } 18 findlength = userinputpasswd.find(passwd.front(), findlength);//從頭開始找到第一個元素和密碼匹配的位置 19 if (findlength != std::string::npos)//找不到就要break了。 20 { 21 std::string substr = userinputpasswd.substr(findlength, passwd.size()); 22 if (substr.size() < passwd.size()) 23 { 24 break; 25 } 26 int comp =substr.compare(passwd); 27 if (comp == 0) 28 { 29 isOK = true; 30 break; 31 } 32 } 33 else { 34 break; 35 } 36 } 37 std::cout << (isOK ? "密碼正確" : "密碼錯誤")<<std::endl; 38 return 0; 39 }
運行結果:
給定的字符串:218519
測試字符串:218519
結果正確。
輸入字符串:6262626564542621851965656
輸入的字符串含有字串:」218519「,結果應爲正確。
輸出結果:密碼正確
結果正確
輸入的字符串:123456
輸出結果:密碼錯誤。
結果正確
輸入密碼:5161816+1856165185615316
輸出結果:密碼錯誤。
結果正確。
這就是一個簡單的實現,在個人Workstation(工做站)上面好像不須要一秒就能完成。可是咱們知道虛位密碼功能是用於嵌入式設備上面的,嵌入式設備一般是很是的week。因此還要在Arduino Uno上驗證。(ATMEGA328P 已經很week了);
Arduino uno是一塊基於Atemel 愛特梅爾(現已被Microchip 微芯 收購)Atmega 328p的8位嵌入式開發板,因爲其支持C++的特性已經簡單易用受到全世界範圍內嵌入式愛好者(包括藝術家)的喜好。
atmega328p在Arduino Uno上運行於16MHz的主頻狀態,正常應該運行在20Mhz的狀態。這是爲了兼容前代設備。
Arduino代碼:
1 int findlength = 0;//尋找的位置 2 String passwd = "218519"; 3 bool isOK = false; 4 // The setup() function runs once each time the micro-controller starts 5 void setup() 6 { 7 Serial.begin(9600); 8 Serial.println("Please enter you passwd:"); 9 } 10 11 // Add the main program code into the continuous loop() function 12 void loop() 13 { 14 findlength = 0; 15 isOK = false; 16 if (Serial.available()) 17 { 18 String pass = Serial.readString(); 19 Serial.println(pass); 20 Serial.flush(); 21 while (findlength < pass.length()) 22 { 23 if (findlength != 0) 24 { 25 findlength++; 26 } 27 findlength = pass.indexOf(passwd.charAt(0), findlength); 28 if (findlength == -1) 29 { 30 break; 31 } 32 else { 33 String substr = pass.substring(findlength, findlength + passwd.length()); 34 int comp = passwd.compareTo(substr); 35 if (comp == 0) 36 { 37 isOK = true; 38 break; 39 } 40 } 41 } 42 Serial.println(isOK ? "OK" : "NO"); 43 Serial.println("Please enter you passwd:"); 44 } 45 46 delay(500); 47 }
這是標準的Arduino代碼能夠適用於任何兼容Arduino的設備(好比ESP8266),這裏在Arduino Uno上驗證是由於他足夠表明嵌入式設備的實力。(單片機實力不好是公認的事實)
運行結果:
與上面相似於,因爲嵌入式代碼是一種沒有終止的,只要給電就一直跑的代碼,因此能夠看簡單這些代碼一直在循環(如今的計算機也是這樣)。
輸入給定的元素都很快。並且速度均在一秒內給出。因此證實虛位密碼功能在上面仍是很簡單就能實現的。