文檔流是文檔中可顯示對(duì)象在排列時(shí)所占用的位置。比如網(wǎng)頁(yè)的div標(biāo)簽它默認(rèn)占用的寬度位置是一整行,p標(biāo)簽?zāi)J(rèn)占用寬度也是一整行,因?yàn)閐iv標(biāo)簽和p標(biāo)簽是塊狀對(duì)象。
網(wǎng)頁(yè)中大部分對(duì)象默認(rèn)是占用文檔流,也有一些對(duì)象是不占文檔流的,比如表單中隱藏域。當(dāng)然我們也可以讓占用文檔流的元素轉(zhuǎn)換成不占文檔流,這就要用到CSS中屬性position來(lái)控制。
看看CSS 2.0對(duì)position的定義:檢索對(duì)象的定位方式。共有4種取值。
static:默認(rèn)值,無(wú)特殊(靜態(tài))定位。對(duì)象遵循HTML定位規(guī)則 。
absolute:絕對(duì)定位。將對(duì)象從文檔流中拖出,使用left,right,top,bottom等屬性相對(duì)于其最接近的一個(gè)最有定位設(shè)置的父對(duì)象進(jìn)行絕對(duì)定位。如果不存在這樣的父對(duì)象,則依據(jù)body對(duì)象。而其層疊通過(guò)z-index屬性定義 。當(dāng)對(duì)象定位在瀏覽器窗口以外,瀏覽器因此顯示滾動(dòng)條。
fixed:固定定位。對(duì)象定位遵從絕對(duì)(absolute)方式。但是要遵守一些規(guī)范。當(dāng)對(duì)象定位在瀏覽器窗口以外,瀏覽器不會(huì)因此顯示滾動(dòng)條,而當(dāng)滾動(dòng)條滾動(dòng)時(shí),對(duì)象始終固定在原來(lái)位置。
relative:相對(duì)定位。對(duì)象不可層疊,但將依據(jù)left,right,top,bottom等屬性在正常文檔流中偏移位置。當(dāng)對(duì)象定位在瀏覽器窗口以外,瀏覽器因此顯示滾動(dòng)條。
inherit:繼承值,對(duì)象將繼承其父對(duì)象相應(yīng)的值
posted @
2009-10-13 16:56 華夢(mèng)行 閱讀(904) |
評(píng)論 (0) |
編輯 收藏
發(fā)現(xiàn)一個(gè)不錯(cuò)的養(yǎng)生網(wǎng)站 養(yǎng)生之道 www.yszd.org ,希望大家喜歡。
posted @
2009-09-25 22:25 華夢(mèng)行 閱讀(268) |
評(píng)論 (0) |
編輯 收藏
hessian
posted @
2009-08-24 09:26 華夢(mèng)行 閱讀(229) |
評(píng)論 (0) |
編輯 收藏
http://xstream.codehaus.org/json-tutorial.html
posted @
2009-08-12 08:55 華夢(mèng)行 閱讀(269) |
評(píng)論 (0) |
編輯 收藏
/*
CSS Reset for Taobao
注意:這里是 ONLY for Taobao 的 reset rules
維護(hù):玉伯(lifesinger@gmail.com), 正淳(ragecarrier@gmail.com)
*/
/* require(reset.css) */
html {
color: #404040; /* 淘寶文字默認(rèn)色 */
background: #fff; /* 覆蓋掉用戶(hù)在不知情的情況下,設(shè)置的頁(yè)面背景 */
}
/* 淘寶鏈接默認(rèn)色 */
a { color: #404040; }
a:hover { color: #f60; }
/* 重置 hr */
hr {
color: #ccc;
background-color: #ccc;
}
/* misc */
html {
/* 讓非ie瀏覽器默認(rèn)也顯示垂直滾動(dòng)條,防止因滾動(dòng)條引起的閃爍 */
overflow-y: scroll;
}
posted @
2009-07-29 18:09 華夢(mèng)行 閱讀(508) |
評(píng)論 (0) |
編輯 收藏
javascript的繼承機(jī)制并不是明確規(guī)定的,而是通過(guò)模仿實(shí)現(xiàn)的,意味著繼承不是由解釋程序處理,開(kāi)發(fā)者有權(quán)決定最適合的繼承方式. 下面我給出幾種常用的方法:
1 .對(duì)象冒充
原理: 構(gòu)造函數(shù)使用this關(guān)鍵字給所有屬性和方法賦值, 因?yàn)闃?gòu)造函數(shù)只是一個(gè)函數(shù),所以可以使ClassA的構(gòu)造函數(shù)成為classB的方法,然后調(diào)用它.這樣classB就會(huì)收到classA的構(gòu)造函數(shù)中定義的屬性和方法.例子:
function classA(name)
{
this.name=name;
this.showName=function(){alert(this.name);}
}
function classB(name)
{
this.newMethod = classA;
this.newMethod(name);
}
obj = new classA("hero");
objB = new classB("dby");
obj.showName(); // print hero
objB.showName(); // print dby 說(shuō)明classB 繼承了classA的方法.
對(duì)象冒充可以實(shí)現(xiàn)多重繼承 例如
function classz(){
this.newMethod = classX;
this.newMethod();
delete this.newMethod;
this.newMethod=classY;
this.newMethod():
delete this.newMethod;
}
但是如果classX和classY有相同的屬性或者方法,classY具有高優(yōu)先級(jí).
2.call()方法
call方法使與經(jīng)典的對(duì)象冒充法就相近的方法,它的第一個(gè)參數(shù)用作this的對(duì)象,其他參數(shù)都直接傳遞給函數(shù)自身.
function sayName(perfix)
{
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.call(obj,"hello," );
function classA(name)
{
this.name=name;
this.showName=function(){alert(this.name);};
}
function classB(name)
{
classA.call(this,name);
}
objB = new classB("bing");
objB.showName();////說(shuō)明classB繼承classA的showName方法
3.apply()方法
aplly()方法有2個(gè)參數(shù),一個(gè)用作this對(duì)象,一個(gè)使傳遞給函數(shù)的參數(shù)數(shù)組.
function sayName(perfix)
{
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.aplly(obj,new Array("hello,") );
4. 原型鏈
prototype對(duì)象的任何屬性和方法都會(huì)被傳遞給對(duì)應(yīng)類(lèi)的所有實(shí)例,原型鏈就是用這種方式來(lái)顯現(xiàn)繼承.
function classA (){}
classA.prototype.name="hero";
classA.prototype.showName=function(){alert(this.name)}
function classB(){}
classB.prototype=new classA();
objb = new classB()
objb.showName();//print hero 說(shuō)明b繼承了a的方法
這里需要注意 調(diào)用classA的構(gòu)造函數(shù)時(shí),沒(méi)有給它傳遞參數(shù),這是原型鏈的標(biāo)準(zhǔn)做法,確保函數(shù)的構(gòu)造函數(shù)沒(méi)有任何參數(shù).
并且 子類(lèi)的所有屬性和方法,必須出現(xiàn)在prototype屬性被賦值后,應(yīng)為在它之前賦的值會(huì)被刪除.因?yàn)閷?duì)象的prototype屬性被替換成了新對(duì)象,添加了新方法的原始對(duì)象將被銷(xiāo)毀.
5 混和方式
就是用冒充方式 定義構(gòu)造函數(shù)屬性,用原型法定義對(duì)象方法.
function classA(name)
{
this.name=name;
}
classA.prototype.showName=function(){alert(this.name)}
function classB(name)
{
classA.call(this,name);
}
classB.prototype = new classA();
classB.prototype.showName1=function(){alert(this.name+"*****");};
obj = new classB("hero");
obj.showName();
obj.showName1();
在classB的構(gòu)造函數(shù)中通過(guò)調(diào)用call方法 繼承classA中的name屬性,用原型鏈來(lái)繼承classA的showName方法.
posted @
2009-07-16 13:47 華夢(mèng)行 閱讀(117) |
評(píng)論 (0) |
編輯 收藏
1)Sun的JVM在實(shí)現(xiàn)Selector上,在Linux和Windows平臺(tái)下的細(xì)節(jié)。
2)Selector類(lèi)的wakeup()方法如何喚醒阻塞在select()系統(tǒng)調(diào)用上的細(xì)節(jié)。
先給大家做一個(gè)簡(jiǎn)單的回顧,在Windows下,Sun的Java虛擬機(jī)在Selector.open()時(shí)會(huì)自己和自己建立loopback的TCP鏈接;在Linux下,Selector會(huì)創(chuàng)建pipe。這主要是為了Selector.wakeup()可以方便喚醒阻塞在select()系統(tǒng)調(diào)用上的線程(通過(guò)向自己所建立的TCP鏈接和管道上隨便寫(xiě)點(diǎn)什么就可以喚醒阻塞線程)
我們知道,無(wú)論是建立TCP鏈接還是建立管道都會(huì)消耗系統(tǒng)資源,而在Windows上,某些Windows上的防火墻設(shè)置還可能會(huì)導(dǎo)致Java的Selector因?yàn)榻⒉黄餷oopback的TCP鏈接而出現(xiàn)異常。
而在我的另一篇文章《用GDB調(diào)試Java程序》中介紹了另一個(gè)Java的解釋器——GNU的gij,以及編譯器gcj,不但可以比較高效地運(yùn)行Java程序,而且還可以把Java程序直接編譯成可執(zhí)行文件。
GNU的之所以要重做一個(gè)Java的編譯和解釋器,其一個(gè)重要原因就是想解釋Sun的JVM的效率和資源耗費(fèi)問(wèn)題。當(dāng)然,GNU的Java編譯/解釋器并不需要考慮太多復(fù)雜的平臺(tái),他們只需要專(zhuān)注于Linux和衍生自Unix System V的操作系統(tǒng),對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),離開(kāi)了Windows,一切都會(huì)變得簡(jiǎn)單起來(lái)。在這里,讓我們看看GNU的gij是如何解釋Selector.open()和Selector.wakeup()的。
同樣,我們需要一個(gè)測(cè)試程序。在這里,為了清晰,我不會(huì)例出所有的代碼,我只給出我所使用的這個(gè)程序的一些關(guān)鍵代碼。
我的這個(gè)測(cè)試程序中,和所有的Socket程序一樣,下面是一個(gè)比較標(biāo)準(zhǔn)的框架,當(dāng)然,這個(gè)框架應(yīng)該是在一個(gè)線程中,也就是一個(gè)需要繼承Runnable接口,并實(shí)現(xiàn)run()方法的一個(gè)類(lèi)。(注意:其中的s是一個(gè)成員變量,是Selector類(lèi)型,以便主線程序使用)
//生成一個(gè)偵聽(tīng)端
ServerSocketChannel ssc = ServerSocketChannel.open();
//將偵聽(tīng)端設(shè)為異步方式
ssc.configureBlocking(false);
//生成一個(gè)信號(hào)監(jiān)視器
s = Selector.open();
//偵聽(tīng)端綁定到一個(gè)端口
ssc.socket().bind(new InetSocketAddress(port));
//設(shè)置偵聽(tīng)端所選的異步信號(hào)OP_ACCEPT
ssc.register(s,SelectionKey.OP_ACCEPT);
System.out.println("echo server has been set up ......");
while(true){
int n = s.select();
if (n == 0) { //沒(méi)有指定的I/O事件發(fā)生
continue;
}
Iterator it = s.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
if (key.isAcceptable()) { //偵聽(tīng)端信號(hào)觸發(fā)
…… …… ……
…… …… ……
}
if (key.isReadable()) { //某socket可讀信號(hào)
…… …… ……
…… …… ……
}
it.remove();
}
}
而在主線程中,我們可以通過(guò)Selector.wakeup()來(lái)喚醒這個(gè)阻塞在select()上的線程,下面是寫(xiě)在主線程中的喚醒程序:
new Thread(this).start();
try{
//Sleep 30 seconds
Thread.sleep(30000);
System.out.println("wakeup the select");
s.wakeup();
}catch(Exception e){
e.printStackTrace();
}
這個(gè)程序在主線程中,先啟動(dòng)一個(gè)線程,也就是上面那個(gè)Socket線程,然后休息30秒,為的是讓上面的那個(gè)線程有阻塞在select(),然后打印出一條信息,這是為了我們用strace命令查看具體的系統(tǒng)調(diào)用時(shí)能夠快速定位。之后調(diào)用的是Selector的wakeup()方法來(lái)喚醒偵聽(tīng)線程。
接下來(lái),我們可以通過(guò)兩種方式來(lái)編譯這個(gè)程序:
1)使用gcj或是sun的javac編譯成class文件,然后使用gij解釋執(zhí)行。
2)使用gcj直接編譯成可執(zhí)行文件。
(無(wú)論你用那種方法,都是一樣的結(jié)果,本文使用第二種方法,關(guān)于gcj的編譯方法,請(qǐng)參看我的《用GDB調(diào)試Java程序》)
編譯成可執(zhí)行文件后,執(zhí)行程序時(shí),使用lsof命令,我們可以看到?jīng)]有任何pipe的建立。可見(jiàn)GNU的解釋更為的節(jié)省資源。而對(duì)于一個(gè)Unix的C程序員來(lái)說(shuō),這意味著如果要喚醒select()只能使用pthread_kill()來(lái)發(fā)送一個(gè)信號(hào)了。下面就讓我們使用strace命令來(lái)驗(yàn)證這個(gè)想法。
下圖是使用strace命令來(lái)跟蹤整個(gè)程序運(yùn)行時(shí)的系統(tǒng)調(diào)用,我們利用我們的輸出的“wakeup the select”字符串快速的找到了wakeup的實(shí)際系統(tǒng)調(diào)用。
posted @
2009-06-16 14:50 華夢(mèng)行 閱讀(565) |
評(píng)論 (0) |
編輯 收藏
很早就聽(tīng)說(shuō)tomcat6使用nio了,這幾天突然想到一個(gè)問(wèn)題,使用nio代替?zhèn)鹘y(tǒng)的bio,ThreadLocal豈不是會(huì)存在沖突?
如果讀者有socket的編程基礎(chǔ),應(yīng)該會(huì)接觸過(guò)堵塞socket和非堵塞socket,堵塞socket就是在accept、read、write等IO操作的的時(shí)候,如果沒(méi)有可用符合條件的資源,不馬上返回,一直等待直到有資源為止。而非堵塞socket則是在執(zhí)行select的時(shí)候,當(dāng)沒(méi)有資源的時(shí)候堵塞,當(dāng)有符合資源的時(shí)候,返回一個(gè)信號(hào),然后程序就可以執(zhí)行accept、read、write等操作,這個(gè)時(shí)候,這些操作是馬上完成,并且馬上返回。而windows的winsock則有所不同,可以綁定到一個(gè)EventHandle里,也可以綁定到一個(gè)HWND里,當(dāng)有資源到達(dá)時(shí),發(fā)出事件,這時(shí)執(zhí)行的io操作也是馬上完成、馬上返回的。一般來(lái)說(shuō),如果使用堵塞socket,通常我們時(shí)開(kāi)一個(gè)線程accept socket,當(dāng)有socket鏈接的時(shí)候,開(kāi)一個(gè)單獨(dú)的線程處理這個(gè)socket;如果使用非堵塞socket,通常是只有一個(gè)線程,一開(kāi)始是select狀態(tài),當(dāng)有信號(hào)的時(shí)候馬上處理,然后繼續(xù)select狀態(tài)。
按照大多數(shù)人的說(shuō)法,堵塞socket比非堵塞socket的性能要好。不過(guò)也有小部分人并不是這樣認(rèn)為的,例如Indy項(xiàng)目(Delphi一個(gè)比較出色的網(wǎng)絡(luò)包),它就是使用多線程+堵塞socket模式的。另外,堵塞socket比非堵塞socket容易理解,符合一般人的思維,編程相對(duì)比較容易。
nio其實(shí)也是類(lèi)似上面的情況。在JDK1.4,sun公司大范圍提升Java的性能,其中NIO就是其中一項(xiàng)。Java的IO操作集中在java.io這個(gè)包中,是基于流的阻塞API(即BIO,Block IO)。對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō),這樣的API使用很方便,然而,一些對(duì)性能要求較高的應(yīng)用,尤其是服務(wù)端應(yīng)用,往往需要一個(gè)更為有效的方式來(lái)處理IO。從JDK 1.4起,NIO API作為一個(gè)基于緩沖區(qū),并能提供非阻塞O操作的API(即NIO,non-blocking IO)被引入。 BIO與NIO一個(gè)比較重要的不同,是我們使用BIO的時(shí)候往往會(huì)引入多線程,每個(gè)連接一個(gè)單獨(dú)的線程;而NIO則是使用單線程或者只使用少量的多線程,每個(gè)連接共用一個(gè)線程。
這個(gè)時(shí)候,問(wèn)題就出來(lái)了:我們非常多的java應(yīng)用是使用ThreadLocal的,例如JSF的FaceContext、Hibernate的session管理、Struts2的Context的管理等等,幾乎所有框架都或多或少地應(yīng)用ThreadLocal。如果存在沖突,那豈不驚天動(dòng)地?
后來(lái)終于在Tomcat6的文檔(http://tomcat.apache.org/tomcat-6.0-doc/aio.html)找到答案。根據(jù)上面說(shuō)明,應(yīng)該Tomcat6應(yīng)用nio只是用在處理發(fā)送、接收信息的時(shí)候用到,也就是說(shuō),tomcat6還是傳統(tǒng)的多線程Servlet,我畫(huà)了下面兩個(gè)圖來(lái)列出區(qū)別:
tomcat5:客戶(hù)端連接到達(dá) -> 傳統(tǒng)的SeverSocket.accept接收連接 -> 從線程池取出一個(gè)線程 -> 在該線程讀取文本并且解析HTTP協(xié)議 -> 在該線程生成ServletRequest、ServletResponse,取出請(qǐng)求的Servlet -> 在該線程執(zhí)行這個(gè)Servlet -> 在該線程把ServletResponse的內(nèi)容發(fā)送到客戶(hù)端連接 -> 關(guān)閉連接。
我以前理解的使用nio后的tomcat6:客戶(hù)端連接到達(dá) -> nio接收連接 -> nio使用輪詢(xún)方式讀取文本并且解析HTTP協(xié)議(單線程) -> 生成ServletRequest、ServletResponse,取出請(qǐng)求的Servlet -> 直接在本線程執(zhí)行這個(gè)Servlet -> 把ServletResponse的內(nèi)容發(fā)送到客戶(hù)端連接 -> 關(guān)閉連接。
實(shí)際的tomcat6:客戶(hù)端連接到達(dá) -> nio接收連接 -> nio使用輪詢(xún)方式讀取文本并且解析HTTP協(xié)議(單線程) -> 生成ServletRequest、ServletResponse,取出請(qǐng)求的Servlet -> 從線程池取出線程,并在該線程執(zhí)行這個(gè)Servlet -> 把ServletResponse的內(nèi)容發(fā)送到客戶(hù)端連接 -> 關(guān)閉連接。
從上圖可以看出,BIO與NIO的不同,也導(dǎo)致進(jìn)入客戶(hù)端處理線程的時(shí)刻有所不同:tomcat5在接受連接后馬上進(jìn)入客戶(hù)端線程,在客戶(hù)端線程里解析HTTP協(xié)議,而tomcat6則是解析完HTTP協(xié)議后才進(jìn)入多線程,另外,tomcat6也比5早脫離客戶(hù)端線程的環(huán)境。
實(shí)際的tomcat6與我之前猜想的差別主要集中在如何處理servlet的問(wèn)題上。實(shí)際上即使拋開(kāi)ThreadLocal的問(wèn)題,我之前理解tomcat6只使用一個(gè)線程處理的想法其實(shí)是行不同的。大家都有經(jīng)驗(yàn):servlet是基于BIO的,執(zhí)行期間會(huì)存在堵塞的,例如讀取文件、數(shù)據(jù)庫(kù)操作等等。tomcat6使用了nio,但不可能要求servlet里面要使用nio,而一旦存在堵塞,效率自然會(huì)銳降。
所以,最終的結(jié)論當(dāng)然是tomcat6的servlet里面,ThreadLocal照樣可以使用,不存在沖突
posted @
2009-06-16 14:30 華夢(mèng)行 閱讀(211) |
評(píng)論 (0) |
編輯 收藏
我就拿一個(gè)房子來(lái)做一個(gè)比方吧,服務(wù)器好比就是一幢房子,黑客最直接的方式就是帶著一些撬鎖的工具,去把房子的鎖給撬掉,然后奪門(mén)而入,這種方式被稱(chēng)為服務(wù)器入侵。還有一類(lèi)就是它直接撬大門(mén)鎖撬不開(kāi),它就把這個(gè)房子的窗打破,從窗子里面鉆進(jìn)去,來(lái)進(jìn)行破壞,這種方式叫做網(wǎng)站入侵。還有一類(lèi)就是黑客帶著一只訓(xùn)練有素的小猴子,讓小猴子爬到房子的房頂,從煙囪里面鉆進(jìn)去,然后把大門(mén)打開(kāi),這種方式叫做特洛伊木馬入侵。還有一類(lèi)就是我們前面講到那個(gè)事件的DDOS攻擊這個(gè)技術(shù),這個(gè)相當(dāng)于黑客帶著一大幫人過(guò)來(lái)把房子的大門(mén)給堵住了,讓房子里面的人出不來(lái),讓外面的人也進(jìn)不去,這就是DDOS攻擊。
posted @
2009-06-10 10:40 華夢(mèng)行 閱讀(142) |
評(píng)論 (0) |
編輯 收藏
SELECT DATEADD(mm,DATEDIFF(mm,0,getdate()),0)
//首先選出當(dāng)前月,然后把他轉(zhuǎn)換為日期
select (2009-1900)*12
select DATEDIFF(mm,0,getdate())
posted @
2009-06-08 14:39 華夢(mèng)行 閱讀(178) |
評(píng)論 (0) |
編輯 收藏
?#define ? WINVER ? 0x0050??
#define ? WINVER ? 0x0500,這個(gè)表示是為Windows ? 2000編譯,不保證Windows ? 98/NT4可以正常運(yùn)行??
Windows ? Server ? 2003 ?
? WINVER>=0x0502 ?
? ? ?
? Windows ? XP ? ?
? WINVER>=0x0501 ?
? ? ?
? Windows ? 2000 ?
? WINVER>=0x0500 ?
? ? ?
? Windows ? NT ? 4.0 ?
? WINVER>=0x0400 ?
? ? ?
? Windows ? Me ?
? WINVER>=0x0500 ?
? ? ?
? Windows ? 98 ?
? WINVER>=0x0410 ?
? ? ?
? Windows ? 95 ?
? WINVER>=0x0400???
?????
posted @
2009-03-26 22:15 華夢(mèng)行 閱讀(177) |
評(píng)論 (0) |
編輯 收藏
?// TODO: Add your message handler code here and/or call default
?/*HDC hdc;
?hdc=::GetDC(m_hWnd);
?MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
?LineTo(hdc,point.x,point.y);
?::ReleaseDC(m_hWnd,hdc);*/
?/*CDC *pDC=GetDC();
?pDC->MoveTo(m_ptOrigin);
?pDC->LineTo(point);
?ReleaseDC(pDC);*/
?//CClientDC dc(this);
?/*CClientDC dc(GetParent());
?dc.MoveTo(m_ptOrigin);
?dc.LineTo(point);*/
?//CWindowDC dc(this);
?//CWindowDC dc(GetParent());
?/*CWindowDC dc(GetDesktopWindow());
?dc.MoveTo(m_ptOrigin);
?dc.LineTo(point);*/
?/*CPen pen(PS_DOT,1,RGB(0,255,0));
?CClientDC dc(this);
?CPen *pOldPen=dc.SelectObject(&pen);
?dc.MoveTo(m_ptOrigin);
?dc.LineTo(point);
?dc.SelectObject(pOldPen);*/
//?CBrush brush(RGB(255,0,0));
?/*CBitmap bitmap;
?bitmap.LoadBitmap(IDB_BITMAP1);
?CBrush brush(&bitmap);*/
?/*CClientDC dc(this);
?//dc.FillRect(CRect(m_ptOrigin,point),&brush);
?CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
?CBrush *pOldBrush=dc.SelectObject(pBrush);
?dc.Rectangle(CRect(m_ptOrigin,point));
?dc.SelectObject(pOldBrush);*/
?m_bDraw=FALSE;
?CView::OnLButtonUp(nFlags, point);
posted @
2009-03-24 16:25 華夢(mèng)行 閱讀(164) |
評(píng)論 (0) |
編輯 收藏
#include <iostream.h>
#include <string>
char* strToBinary(int x);
char* strToHex(int i);
char* transToGKB(char *t);
int main ()
{
char *p=strToBinary(233);
//cout<<p;
//cout<<strToHex(233);
cout<<transToGKB("商");
return 0;
}
char* transToGKB(char *t){
?int res=0;
?? int intlen;
?? intlen=strlen(t);
?? if(intlen>1){
??? char *result=new char[5];
?? int i=0;
?if(0>t[0]){
??? res=256+t[0];
? }
?char *p1=strToHex(res);
?if(0>t[1]){
??res=256+t[1];
?}
?char *p2=strToHex(res);
?result=p1;
?result[2]=p2[0];
?result[3]=p2[1];?
?result[4]='\0';?
?return result;
?}
?? else{
??? //if(t[0]>64)
??? char * p=new char[3];
??? p=strToHex(t[0]);
??? p[2]='\0';
??? return? p;
?? }
}
?
//數(shù)字轉(zhuǎn)為二進(jìn)制(255以?xún)?nèi)的正數(shù))
char* strToBinary(int i){
?char *result=new?? char[9];
?int n=1;
?int m;
?int c=0;
?int j=8;
?for(c=0;c<8;c++){
??m=i%2;
??j=j-1;
??i=n=i/2;
??if(n>=0){
???if (m>0){
????result[j]='1';
???}else
???{
????result[j]='0';
???}?
??}
??
?}
?result[8]='\0';
?
//?cout<<result;
?return result;
}
//數(shù)字轉(zhuǎn)為十六進(jìn)制(255以?xún)?nèi)的正數(shù))
char* strToHex(int i){
?char *result=new?? char[3];
?int n=1;
?int m;
?int c=0;
?int j=2;
?for(c=0;c<2;c++){
??m=i%16;
??j=j-1;
??i=n=i/16;
??if(n>=0){
???if (m>0){
????if (m==1){
????????????????? result[j]='1';
????}
????else if (m==2){
?????result[j]='2';
????}
????else if (m==3){
?????result[j]='3';
????}
????else if (m==4){
?????result[j]='4';
????}
????else if (m==5){
?????result[j]='5';
????}
????else if (m==6){
?????result[j]='6';
????}
????else if (m==7){
?????result[j]='7';
????}
????else if (m==8){
?????result[j]='8';
????}
????else if (m==9){
?????result[j]='9';
????}
????else if (m==10){
?????result[j]='A';
????}
????else if (m==11){
?????result[j]='B';
????}
????else if (m==12){
?????result[j]='C';
????}
????else if (m==13){
?????result[j]='D';
????}
????else if (m==14){
?????result[j]='E';
????}
????else if (m==15){
?????result[j]='F';
????}
???}else
???{
????result[j]='0';
???}?
??}
?}
?result[2]='\0';
?return result;
}
posted @
2009-03-19 16:37 華夢(mèng)行 閱讀(183) |
評(píng)論 (0) |
編輯 收藏
#include <iostream.h>
#include <string>
void yihuo(char *t,int n, int m);
void? myToBinary();
void transToGKB(char *t);
void? myToHex();
int main(){
//cout<<"GOOD";
int i=122;
int j=233;
int m=j^i;
?char t[128]={0xC9,0xCC,0xC9,0xCC,0xC9,0xCC,'\0',0xC9,0xCC,0xC9,0xCC};
yihuo(t,0, 2);
//?transToGKB(t);
//cout<<m;
//yihuo(2, 3);
//myToHex();
// myToBinary();
cout<<endl;
return 0;
}
//進(jìn)制之間的轉(zhuǎn)換
? // 字符串傳為16進(jìn)制
void? myToHex(){
?char c[] = "CC";
?unsigned long tt= strtoul(c, NULL, 16);
cout<<strtol(c, NULL, 16);
}
// 字符串傳為16進(jìn)制
void? myToBinary(){
?char c[] = "10000000";
//?unsigned long tt= strtoul(c, NULL, 2);
?cout<<strtol(c, NULL, 2);
?
?
}
//漢字的轉(zhuǎn)換, 16進(jìn)制轉(zhuǎn)換為漢字
void transToGKB(char *t){
?
?//?char *t="商戶(hù)";
?//?CharN
?//如果是負(fù)數(shù),則轉(zhuǎn)為正整數(shù)
?//?if(0>t[0]){
?//??? res=256+t[0];
?//?}
?int j=t[0];
?cout<<t<<endl;
}
void yihuo(char *t,int n, int m) {
?char *tt="商戶(hù)說(shuō)的算";
??? //轉(zhuǎn)成數(shù)字并且保存到數(shù)組,然后求異或
?//求的長(zhǎng)度
const int mylen=strlen(tt)+1;
char mysplit[1000];
//循環(huán)對(duì)這個(gè)整形數(shù)組進(jìn)行賦值
int i=0;
for(i<0;i<mylen-1;i++){
?if (tt[i]<0){
mysplit[i]=256+tt[i];
?}else
?{
mysplit[i]=tt[i];
?}
}
int result=mysplit[n-1];
int j;
for(j=n;j<n+m;j++){
?result=result^mysplit[n];
?cout<<"L"<<endl;
cout<<mysplit[n];
?cout<<"M"<<endl;
}
//進(jìn)行遍歷求異或
mysplit[mylen-1]='\0';
cout<<mysplit;
cout<<"ee";
if(result<0)
result=256+result;
cout<<result;
?//int j=t[0];
//?cout<<t<<endl;
?}
?
posted @
2009-03-17 17:47 華夢(mèng)行 閱讀(453) |
評(píng)論 (0) |
編輯 收藏
Integer.parseInt(String.valueOf(o));
posted @
2009-03-14 15:21 華夢(mèng)行 閱讀(272) |
評(píng)論 (0) |
編輯 收藏
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
?Text1.Text = PropBag.ReadProperty("RecordSource", _
?????? m_def_recordSource)
? Text2.Text = PropBag.ReadProperty _
?? ("ConnectionString", m_def_connectionString)
End Sub
posted @
2009-03-11 22:27 華夢(mèng)行 閱讀(130) |
評(píng)論 (0) |
編輯 收藏
int main(void)
{
?? int m=4;
?? int nn;
?? int? *n;
?? int *s;
?? int *p;
?? int *q;
?? n=&m;
??
? nn=n;
?? q=n;
? s=nn;
?? printf("%08x",*s);
?? return 0;
}
posted @
2009-03-10 21:45 華夢(mèng)行 閱讀(135) |
評(píng)論 (0) |
編輯 收藏
0xFFFFFF20? 數(shù)據(jù)輸入緩沖區(qū)
0xFFFFFF24? 輸出數(shù)據(jù)緩沖區(qū)???
0xFFFFFF28? 控制寄存器
posted @
2009-03-10 16:51 華夢(mèng)行 閱讀(234) |
評(píng)論 (0) |
編輯 收藏
1.程序段:程序段為程序代碼在內(nèi)存中的映射.一個(gè)程序可以在內(nèi)存中多有個(gè)副本.
2.初始化過(guò)的數(shù)據(jù):在程序運(yùn)行值初已經(jīng)對(duì)變量進(jìn)行初始化的
3.未初始化過(guò)的數(shù)據(jù):在程序運(yùn)行初未對(duì)變量進(jìn)行初始化的數(shù)據(jù)
4.堆(stack):存儲(chǔ)局部,臨時(shí)變量,在程序塊開(kāi)始時(shí)自動(dòng)分配內(nèi)存,結(jié)束時(shí)自動(dòng)釋放內(nèi)存.存儲(chǔ)函數(shù)的返回指針.
5.棧(heap):存儲(chǔ)動(dòng)態(tài)內(nèi)存分配,需要程序員手工分配,手工釋放.
?
#
include
<stdio.h>
int g1=0, g2=0, g3=0;
intmax(int i)
{
????int m1=0,m2,m3=0,*p_max;
????static n1_max=0,n2_max,n3_max=0;
????p_max =(int*)malloc(10);
????printf("打印max程序地址\n");
????printf("in max: 0x%08x\n\n",max);
????printf("打印max傳入?yún)?shù)地址\n");
????printf("in max: 0x%08x\n\n",&i);
????printf("打印max函數(shù)中靜態(tài)變量地址\n");
????printf("0x%08x\n",&n1_max);//打印各本地變量的內(nèi)存地址
????printf("0x%08x\n",&n2_max);
????printf("0x%08x\n\n",&n3_max);
????printf("打印max函數(shù)中局部變量地址\n");
????printf("0x%08x\n",&m1);//打印各本地變量的內(nèi)存地址
????printf("0x%08x\n",&m2);
????printf("0x%08x\n\n",&m3);
????printf("打印max函數(shù)中malloc分配地址\n");
????printf("0x%08x\n\n",p_max);//打印各本地變量的內(nèi)存地址
????if(i)return 1;
????elsereturn 0;
}
int main(int argc,char**argv)
{
staticint s1=0, s2, s3=0;
int v1=0, v2, v3=0;
int*p;????
p =(int*)malloc(10);
printf("打印各全局變量(已初始化)的內(nèi)存地址\n");
printf("0x%08x\n",&g1);//打印各全局變量的內(nèi)存地址
printf("0x%08x\n",&g2);
printf("0x%08x\n\n",&g3);
printf("======================\n");
printf("打印程序初始程序main地址\n");
printf("main: 0x%08x\n\n", main);
printf("打印主參地址\n");
printf("argv: 0x%08x\n\n",argv);
printf("打印各靜態(tài)變量的內(nèi)存地址\n");
printf("0x%08x\n",&s1);//打印各靜態(tài)變量的內(nèi)存地址
printf("0x%08x\n",&s2);
printf("0x%08x\n\n",&s3);
printf("打印各局部變量的內(nèi)存地址\n");
printf("0x%08x\n",&v1);//打印各本地變量的內(nèi)存地址
printf("0x%08x\n",&v2);
printf("0x%08x\n\n",&v3);
printf("打印malloc分配的堆地址\n");
printf("malloc: 0x%08x\n\n",p);
printf("======================\n");
????max(v1);
printf("======================\n");
printf("打印子函數(shù)起始地址\n");
printf("max: 0x%08x\n\n",max);
return 0;
}
?
這個(gè)程序可以大致查看整個(gè)程序在內(nèi)存中的分配情況:
可以看出,傳入的參數(shù),局部變量,都是在棧頂分布,隨著子函數(shù)的增多而向下增長(zhǎng).
函數(shù)的調(diào)用地址(函數(shù)運(yùn)行代碼),全局變量,靜態(tài)變量都是在分配內(nèi)存的低部存在,而malloc分配的堆則存在于這些內(nèi)存之上,并向上生長(zhǎng)
posted @
2009-03-10 15:40 華夢(mèng)行 閱讀(221) |
評(píng)論 (0) |
編輯 收藏
#include <stdio.h>
#include <string.h>
hello(){
char *hello="dddd大點(diǎn)的";
int i;
for(i=0;i<strlen(hello);i++){
printf("%s\n",&hello[i]);
}
}
void testStr(){
int i=0;
?for(i=0;i<128;i++)
?{
printf("%c",(char)i);
?}
}
void testmy(){
?char *hello="??大點(diǎn)的";
?char hellodd[]={hello};
?unsigned char test= hellodd[2];
?if(test>137){
?printf("大于%u",test);
?}else
?{
??printf("小于");
?}
//putchar((char)hello[5]);
printf("字符:%d \n",hellodd[2]);
printf("%d",strlen( hellodd));
}
//相當(dāng)于substring
teststrcopy(){
char *s="到的得到";
char d[]={"? "};
//strncpy(d,s+0,2);
strncpy(d,s,2);
printf("%s\n",d);
}
int main(void){
//testmy();
?//teststrcopy();
?return 0;
}
?
posted @
2009-03-10 15:23 華夢(mèng)行 閱讀(83) |
評(píng)論 (0) |
編輯 收藏