頁:
[1]
關於Unicode編碼
本帖最後由 在那裡 於 2016-8-27 05:09 PM 編輯我最近寫了一個加密程式,我是以ASCII碼切成四個區段進行加減(-128~127)來加密的。
我以記事本(ANSI編碼)進行加密到一個新的記事本(ANSI編碼),全都正常的跑完也正常。
但是若我把ANSI全改成Unicode編碼的記事本就會亂碼,加密也總會莫名其妙的停掉,只加密一點點文字(不超過五十個字),但是用ifstream的.eof()和.fail()得知是因到底而停止。
而且解密出來也只有一些正確的字,
請問Unicode是如何進行編碼的?跟ASCII有何關係?
為什麼ifstream.eof()在還沒到底時會顯示true?
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div> Unicode超出我的能力範圍,我只能說,網路上都有資料。
顯示Unicode格式的文字,首先要看環境支援不支援,就算有支援,資料也存Unicode格式,
但也有可能會顯示亂碼,要先設定顯示的格式,才能正常顯示你所儲存的內容。
像我的工具就不支援,就要下更多工夫去研究WinAPI。
剩下的,就看你的問題到哪邊,看看有沒有其他高手能解惑你的問題。 本帖最後由 inunu 於 2016-8-29 04:25 AM 編輯
其實我覺得問題不在 Unicode
而是你的算法本身遇到某些數值會出狀況
你可以寫個測試
把 -128, -127, ... 127 各數值丟進加密函數
再把輸出的數值丟進解密函數
看哪些解出來的數值不對如果解出來的數值都正確
不要說 unicode 了, 連 .zip .rar 非文字檔它都可以正常處理
本帖最後由 在那裡 於 2016-8-31 11:25 PM 編輯
抱歉,晚回了,最近剛開學.......
我的算法處理數字範圍只有-128~127,其他超過這數字的我就沒再去動了(應該也不會出現這種數字)。
測試過後我發現一切都正常,並沒有出任何錯誤。
至於Unicode,我是拿我一本電子小說(TXT檔,Unicode編碼)來進行加密的.....不過加著加著不到1KB就自己終止了;
把他改成ANSI編碼則就能完全加密,且解密完後資料也無錯誤。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 不知道方不方便貼上您部分的程式碼呢?
不然都只能用猜的。<br><br><br><br><br><div></div> 本帖最後由 在那裡 於 2016-9-3 08:21 PM 編輯
抱歉又晚回,最近有些忙
加密解密用的加減法
char Encrypt(char word)
{ using namespace std;
if(word <=100 && word >= 0) //0~100
return word+27;//27~127
else if(word>100) //101~ 127
return word-101;//0~26
else if(word>=-100 && word < 0) // -1 ~ -100
return word-28; // -29 ~ -128
else if(word<-100) // -101 ~ -128
return word+100;//-1 ~ -28
else
return word;
}
char Decrypt(char word)
{ using namespace std;
if(word>=27) //27~127
return word-27;//0~100
else if(word<27 && word>=0) //0~26
return word+101;//101~127
else if(word<=-29) //-29~-128
return word+28;//-1~-100
else if(word>-29 && word<0) //-28~-1
return word-100;//-101~-128
else
return word;
}
加密的過程(解密差不多,只是文字改了而已),且結果檢查出來都只會跳出 加密完成(解密完成)!
char ch;
iFile.get(ch);
while(iFile.good())
{
ch = Encrypt(ch);
oFile << ch;
iFile.get(ch);
}
if(iFile.eof())
cout << "加密完成!" << endl;
else if(iFile.fail())
cout << "因資料型態不合而終止。" << endl;
else
cout << "因不明原因中止。" << endl;
iFile.close();
oFile.close();
system("pause");
return;
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 今天才看到...
經過測試我可以正常執行,網上抓了一整篇的小說加解密是正常的。
不知道是不是其他部分出問題?
我完整的程式可參考下方。
編譯後,使用方法
加密:執行檔 -e 輸入檔名 輸出檔名
解密:執行檔 -d 輸入檔名 輸出檔名
#include <iostream>
#include <fstream>
char Encrypt(char word)
{
if(word <=100 && word >= 0) //0~100
return word+27;//27~127
else if(word>100) //101~ 127
return word-101;//0~26
else if(word>=-100 && word < 0) // -1 ~ -100
return word-28; // -29 ~ -128
else if(word<-100) // -101 ~ -128
return word+100;//-1 ~ -28
else
return word;
}
char Decrypt(char word)
{
if(word>=27) //27~127
return word-27;//0~100
else if(word<27 && word>=0) //0~26
return word+101;//101~127
else if(word<=-29) //-29~-128
return word+28;//-1~-100
else if(word>-29 && word<0) //-28~-1
return word-100;//-101~-128
else
return word;
}
int main(int argc,char* argv[])
{
if(argc!=4)
{
std::cout<<"needs 3 argument.\n";
return 0;
}
int mode;
char ch;
std::fstream iFile,oFile;
if(std::string(argv).compare("-e")==0)
mode=0;
else if(std::string(argv).compare("-d")==0)
mode=1;
else
{
std::cout<<"mode error!\n";
return 0;
}
iFile.open(argv,std::fstream::in);
if(!iFile.is_open())
{
std::cout<<"can't open file:"<<argv<<"\n";
return 0;
}
oFile.open(argv,std::fstream::out);
if(!oFile.is_open())
{
std::cout<<"can't open file:"<<argv<<"\n";
iFile.close();
return 0;
}
iFile.get(ch);
while(iFile.good())
{
ch = mode==0?Encrypt(ch):Decrypt(ch);
oFile << ch;
iFile.get(ch);
}
if(iFile.eof())
std::cout << "Done!\n";
else if(iFile.fail())
std::cout << "Data type error\n";
else
std::cout << "unknow error\n";
iFile.close();
oFile.close();
return 0;
}
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁:
[1]