g++ -o tt tt.o -lws2_32 -lclsocketd
g++ -o tt tt.o -Xlinker "-(" -lws2_32 -lclsocketd "-)"
editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\ipmsg.exe
#ifndef NO_STDIO_REDIRECT
else {
redirect_output();
}
#endif
GVIM用的是UTF-8,cmd為GB2312,中文輸出的時候就會亂碼;
將GVIM中的中文轉成GB2312時輸出正常;
SQLITE open時用的是UTF-8,insert時因為直接取的文件中的內容,輸出cmd正常,所以是用的GB2312;
這時候在select中文的時候在GVIM輸入中文字,即使用UTF-8,則無法找到GB2312的數據;
在insert時將數據全部轉成UTF-8后,直接select UTF-8就能夠找到,但輸出cmd為亂碼;
這樣就全部解釋清楚了。
現在要做的就是在insert時轉為UTF-8,至于cmd那垃圾輸出就算了,我可沒興趣為了輸出個東西看還要轉成GB2312,再次噴下微軟。。
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
void
myDisplay(void)

{
// 清除, GL_COLOR_BUFFER_BIT表示清除顏色
glClear(GL_COLOR_BUFFER_BIT);
// 畫一個矩形, 四個參數分別為左上角點的x, y坐標, 右下角點的x, y坐標
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
// 保證前面的OpenGL命令立即執行(而不是讓它們在緩沖區中等待), 其作用跟fflush(stdout)類似
glFlush();
}
// 程序入口
int
main(int argc, char *argv[])

{
// 對GLUT進行初始化
glutInit(&argc, argv);
// 設置顯示方式
// GLUT_RGB表示使用RGB顏色, GLUT_INDEX表示使用索引顏色
// GLUT_SINGLE表示使用單緩沖, GLUT_DOUBLE表示使用雙緩沖
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE );
// 設置窗口在屏幕中的位置
glutInitWindowPosition(100, 100);
// 設置窗口的大小
glutInitWindowSize(400, 400);
// 根據前面設置的信息創建窗口, 參數將被作為窗口的標題
// 此時并不馬上顯示到屏幕上, 等到調用glutMainLoop后才能看到窗口
glutCreateWindow("My first OpenGL Program, not \"Hello World\", - -");
// 設置一個函數, 需要進行畫圖時, 這個函數就會被調用
glutDisplayFunc(&myDisplay);
// 進行一個消息循環
glutMainLoop();
return 0;
}

加了一些技術群,經常會看到一些奇怪的現象。一個新手在群里提了個問題,結果半天沒人回答,倒是會跳出四五個衛道士模樣的人,指手畫腳,指責新手編碼風格不好,習慣不好,種種。看上去句句在理,實際上全部放屁。本來編碼風格之類的東西就是溫飽以后考慮的問題,現在人家連飯還沒吃飽,你要他考慮這種奢侈品,那你要么是吃飽了撐的,要么就是純粹去饞人家。不管回答者水平如何,避而不談問題本身,去扯那些暫時對新人沒有用的東西,那就是方向性的誤導。最終的結果,新人完全搞不明白你在說什么,本來簡單的問題,弄了半天沒搞懂。這是一種嚴重的不負責任,作為技術上的前輩,你可以不回答,但你絕對不要去誤導。
回正題(-。-)。原來從公司拷來的redhat已經被我搞的很亂了,于是萌發了將平臺移植到新的虛擬機里,因為對ubuntu相對比較熟悉,所以今天重裝了ubuntu的虛擬機。重裝途中,困難重重,結果到半夜才勉強搞定。記錄一下遇到的問題,以及解決的辦法,還有一些東西已備以后查看。
1、取消ubuntu默認的點陣字體
cd /etc/fonts/conf.d
sudo ln -sf ../conf.avail/66-wqy-zenhei-sharp-no13px.conf 66-wqy-zenhei-sharp.conf
2、ubuntu初始安裝是沒有ftp/telnet的
sudo apt-get install vsftpd xinetd telnetd其中需要設置:/etc/vsftpd.conf文件中將以下一行注釋去掉:local_enable=YES,目的是可以使用linux用戶登錄ftp(否則只能匿名登錄)。
另外還有個問題,在FTP的put時,似乎由于權限問題會put失敗,嘗試root登錄也失敗,暫時沒有找到原因,以后研究了補上。
3、su - root
ubuntu第一次安裝好后默認無法登錄root,這時候可以通過下面命令修改root口令,就可以su - root了。
sudo passwd root
4、新增字體
將字體文件拷入/home/.fonts目錄下,執行下列命令刷新字體緩存。然后就可以使用新加的字體了。
fc-cache -fvsudo不sudo無所謂。另外建議將字體的權限改成755,以便其他用戶read。
5、最后一個,也是本文的標題,同樣也是困擾我一晚上的問題。在SecureCRT登錄的時候發現中文有亂碼的問題,嘗試了網上的一些辦法,把編碼改UTF-8 GBK都是有問題,最后發現了原來字體的字符集也是有關系的,現在把我改的東西整理如下。
(1)/var/lib/locales/supported.d/local文件中添加一行:zh_CN.UTF-8 UTF-8,執行sudo locale-gen下載文件
(2)在/etc/environment中增加兩行分別為:LANG="zh_CN.UTF-8"和LC_ALL="zh_CN.UTF-8"
(3)~/.profile中增加兩行分別為:export LANG="zh_CN.UTF-8"和export LC_ALL="zh_CN.UTF-8",執行.profile
(4)SecureCRT中選擇終端類型為Linux,選擇編碼為UTF-8,最重要的是選擇一個支持GB2312字符集的字體。因為我常用的Monaco字體不支持,于是我不得不忍痛放棄,在網上找到一個“YaHei Mono”是可以正常顯示的,雖然看上去不如Monaco,不過用著慢慢也習慣了吧(記得大學里做畢業設計的時候用netbeans里一個Yahei console字體和這個很相似),具體詳見這里。
到此SecureCRT終于可以正常顯示漢字了,因為很困了所以只是羅列了一下修改內容,沒有寫太多的理由。在此我不禁要噴一噴微軟,你說你好好的UTF-8不用,都WIN7了還用這么個GB2312,你不是害人嗎。
睡了,有修改內容以后補充。
char retcode[5];
memset( &retcode, 0x00, sizeof(retcode) );
Byte* alObuf;
alObuf = (Byte*)calloc(_MAX_ZMG_BUFFER, sizeof(Byte));
memset(&alObuf, 0x00, sizeof(alObuf));需要用到對informix的兩個庫的操作,一個是本地庫一個是遠程庫,因為要有交叉操作,所以如果不停的開關會影響效率。
EXEC SQL connect to "db1@online7" as 'db1';
EXEC SQL connect to "db2@online9" as 'db2';
用時指定當前的連接:
EXEC SQL set connection 'db1';
EXEC SQL SELECT MAX(index) INTO :index
FROM table
WHERE x=:x AND y=:y;研究了一下浮點型在內存中的表示方法,終于明白fortify果然不是吃素的,原來double型數字真的有可能超過200位的。。
一、浮點型在內存中的表示
單精度float型: 1位符號位, 8位階碼(固定偏移 7F), 尾數23, 固定隱含位有
雙精度double型: 1位符號位, 11位階碼(固定偏移 3FF), 尾數52, 固定隱含位有
long double型: 1位符號位, 15位階碼(固定偏移3FFF), 尾數64, 固定隱含位無
某些編譯器中把long double作double處理
其中,
符號位s:0表示正,1表示負;
階碼e:表示指數,需要減去固定偏移de;
尾數x:表示純小數位,固定隱含位z是指整數位的1或者0。
表示成十進制就是(-1)^s * 2^(e-de) * (z+x)
對于32位系統,float占32位,double占64位
舉例來說,在BIG ENDIAN中二進制表示為01000001 00100000 00000000 00000000的浮點數,根據上面的規則,可以寫成:
0,10000010,0100000 000000000 0000000
符號位s=0,階碼e=10000010b=130,固定偏移de=0x7F=127,尾數x=0.01000000000000000000000b=0.25,固定隱含位有,z=1
根據公式可以算出這個數的十進制表示為:(-1)^0 * 2^(130-127) * (1+0.25) = 10.0
二、一些特殊的浮點數
0,00000000,0000000 00000000 00000000和1,00000000,0000000 00000000 00000000均表示0(階碼和尾數都是0)
*,11111111,******* ******** ******** 表示非法數字(階碼是255時)
最大的float數:0,11111110,1111111 11111111 11111111 用10進制表示約為 +3.4e38
最小的float數:1,11111110,1111111 11111111 11111111 用10進制表示約為 -3.4e38
絕對值最小的float數:0,00000000,0000000 00000000 00000001和1,00000000,0000000 00000000 00000001
三、浮點數的精度
單精度數的尾數用23位存儲,加上默認的小數點前的1位1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。
雙精度的尾數用52位存儲,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以雙精度的有效位數是16位。
如果你在浮點數的有效位后增加數字的話,結果是不會變化的。
四、浮點數的取值范圍
float取值范圍:
負數取值范圍為 -3.4028235E+38 到 -1.401298E-45,正數取值范圍為 1.401298E-45 到 3.4028235E+38。
double取值范圍:
負值取值范圍-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范圍為 4.94065645841246544E-324 到 1.79769313486231570E+308。
所以說,double型在sprintf的時候,要么想辦法回避Buffer Overflow的問題,要么就...給字符數組分配308以上的空間...
今天在fortify代碼掃描的時候檢測出一個HOT,漏洞類型是Buffer Overflow,元兇是sprintf。
sprintf(aTmp, "16.2f", TransAmt);其中aTmp是20位字符數組,TransAmt為double型金額字段,值不確定。
理論上來說,是TransAmt按照格式16.2f寫進aTmp的時候,有可能產生越界的錯誤。我一開始考慮將aTmp長度放長后,double應該可以順利拷進aTmp,嘗試將aTmp的長度分配到50,100,200,還是消除不掉這個HOT,因為不明白是double所表示的浮點數的長度有可能超過200位還是fortify認死理,而銀行又強制規定代碼掃描不能有HOT(-。-),所以將sprintf替換成snprintf。
snprintf(aTmp, sizeof(aTmp), "16.2f", TransAmt);
\MinGW\lib\libmingw32.a(main.o):main.c|| undefined reference to `WinMain@16' 大概意思是WinMain未定義。WinMain是windows程序的入口函數,一般來說沒有main函數或者main函數名拼寫錯誤的話會在編譯的時候報這個錯。我檢查以后,發現main應該是正確的。
google一下后發現有不少人也遇到這個問題。仔細檢查了下Makefile,發現在連接庫的時候-lmingw32寫在了SDL庫的后面,將-lmingw32放在最前面后,問題解決。