每一個可以努力的日子,都是一份厚禮。
C
C/C++反序輸出字符串總結
2011 3月 21st
2年前去T公司面試,面試官給了我一張紙一支筆,說寫個程序吧,輸入一個字符串然後反序輸出。我問輸入輸出是用函數參數呢還是系統I/O,面試官說隨你便,寫完了說說各有什麼優缺點吧。當時我大三,沒有參加過ACM沒有實驗室經歷除了課程設計也沒寫過什麼程序,完全小白。當然至今也仍然是菜鳥一隻,不堪回首啊。
方法一:據說有庫函數strrev()啊 更多 >
RSA讀取密鑰——使用openssl編程
2011 1月 4th
RSA是基於數論中大素數的乘積難分解理論上的非對稱加密法。在此密碼術中,使用公鑰(public key)和私鑰(private key)兩個不同的密鑰:公鑰用於加密,它是向所有人公開的;私鑰用於解密,只有密文的接收者持有。
舉例:小紅希望安全地發送一條消息給小明,消息明文為m,小明的公鑰為K+,小明的私鑰為K-。通信過程為,小紅使用K+加密m,成為密文K+(m),傳送給小明,小明收到後使用K-解密這個密文得到原始消息明文,即m = K-(K+(m))。
具體的密鑰生成算法如下。隨機選擇兩個大素數p和q(比如每個都是1024 bit),計算n = pq, n’ = (p-1)(q-1). 選擇一個e (e小於n) 與n’互質。計算d使得ed = 1 mod n’.則公鑰為(n, e),私鑰為(n, d). 注意p和q都應該保密。
加密過程為c = m^e mod n
解密過程為m = c^d mod n
以上為原理簡介。下面是openssl API編程應用讀取密鑰文件的示例源代碼: 更多 >
struct類型的全局變量初始化
2010 11月 7th
今天在實現一個隊列時犯了一個很傻逼的錯誤。一個定義為struct類型的全局變量,我在想定義完後立刻初始化,就寫成類似下面這種樣子:
struct { int i; int j; } test; test.i = 1; test.j = 1; |
結果gcc編譯器報錯,“initializer element is not constant”
在我的實際情況中,test的成員變量i和j也為strcut類型,報的錯為“struct expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘”
真神奇,int char類型都可以直接初始化,struct類型就不行。
最後在http://bbs.chinaunix.net/thread-1285396-1-1.html的4樓找到了說法。全局變量在編譯時就必須確定其值,故C有靜態存儲區數據必須用常量初始化的規定。
其實很簡單, 在全局空間定義struct test,然後再寫一個初始化函數對test進行賦值就可以了。
Socket編程中用send發送結構體
2009 8月 20th
本文轉載自http://tech.ddvip.com/2008-10/122543769687623.html
最近在開發一個Linux下的聊天軟件,好久沒有做C語言的開發了,感覺到很多東西已經生疏了,這下又碰到用Socket傳遞結構體的問題,google了一下,發現也有不少朋友遇到同樣的問題,所以就打算寫出自己的解決辦法,跟大家分享。
Socket中的send函數可以發送字符串,但不能直接發送結構體,因此在發送端先把結構體轉成字符串,然後用send發送,在接收端recv字符串,再轉換成原先的結構體,這個就是解決問題的主要思路,實現中要注意的問題在下文闡述。
為了客戶端之間能夠互相通信,實現私聊,我採用服務器轉發的方式,因此用戶發送的每條消息中除了消息主體外,還必須包含有發送者、接收者ID等信息,如此採用結構體便是最佳的辦法了。我定義的結構體如下:
struct send_info { char info_from[20]; //發送者ID char info_to[20]; //接收者ID int info_length; //發送的消息主體的長度 char info_content[1024]; //消息主體 }; |