對(duì)于網(wǎng)絡(luò)字節(jié)序與主機(jī)字節(jié)序的轉(zhuǎn)換
發(fā)表時(shí)間:2023-08-14 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]主機(jī)和網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換最近使用C#進(jìn)行網(wǎng)絡(luò)開(kāi)發(fā),需要處理ISO8583報(bào)文,由于其中有些域是數(shù)值型的,于是在傳輸?shù)臅r(shí)候涉及到了字節(jié)序的轉(zhuǎn)換。字節(jié)順序是指占內(nèi)存多于一個(gè)字節(jié)類(lèi)型的數(shù)據(jù)在內(nèi)存中的存放順序...
主機(jī)和網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換
最近使用C#進(jìn)行網(wǎng)絡(luò)開(kāi)發(fā),需要處理ISO8583報(bào)文,由于其中有些域是數(shù)值型的,于是在傳輸?shù)臅r(shí)候涉及到了字節(jié)序的轉(zhuǎn)換。字節(jié)順序是指占內(nèi)存多于一個(gè)字節(jié)類(lèi)型的數(shù)據(jù)在內(nèi)存中的存放順序,通常有兩種字節(jié)順序,根據(jù)他們所處的位置我們分別稱(chēng)為主機(jī)節(jié)序和網(wǎng)絡(luò)字節(jié)序。
通常我們認(rèn)為網(wǎng)絡(luò)字節(jié)序?yàn)闃?biāo)準(zhǔn)順序,封包的時(shí)候,將主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序,拆包的時(shí)候要將網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序。原以為還要自己寫(xiě)函數(shù),其實(shí)網(wǎng)絡(luò)庫(kù)已經(jīng)提供了。
主機(jī)到網(wǎng)絡(luò):short/int/long IPAddress.HostToNetworkOrder(short/int/long)
網(wǎng)絡(luò)到主機(jī):short/int/long IPAddress.NetworkToHostOrder(short/int/long)
主機(jī)字節(jié)序指低字節(jié)數(shù)據(jù)存放在內(nèi)存低地址處,高字節(jié)數(shù)據(jù)存放在內(nèi)存高地址處,如:
int x=1; //此時(shí)x為主機(jī)字節(jié)序:[1][0][0][0] 低位到高位
int y=65536 //此時(shí)y為主機(jī)字節(jié)序:[0][0][1][0] 低位到高位
我們通過(guò)主機(jī)到網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換函數(shù)分別對(duì)x和y進(jìn)行轉(zhuǎn)換得到他們對(duì)應(yīng)的網(wǎng)絡(luò)字節(jié)序值,網(wǎng)絡(luò)節(jié)序是高字節(jié)數(shù)據(jù)存放在低地址處,低字節(jié)數(shù)據(jù)存放在高地址處,如:
int m=IPAddress.HostToNetworkOrder(x);
//此時(shí)m為主機(jī)字節(jié)序:[0][0][0][1] 高位到低位
int n=IPAddress.HostToNetworkOrder(y);
//此時(shí)n為主機(jī)字節(jié)序:[0][1][0][0] 高位到低位
經(jīng)過(guò)轉(zhuǎn)換以后,我們就可以通過(guò)
byte[]btValue=BitConverter.GetBytes(m);
得到一個(gè)長(zhǎng)度為4的byte數(shù)組,然后將這個(gè)數(shù)組設(shè)置到報(bào)文的相應(yīng)位置發(fā)送出去即可。
同樣,收到報(bào)文后,可以將報(bào)文按域拆分,得到btValue,使用
int m=BitConverter.ToInt32(btValue,0);//從btValue的第0位開(kāi)始轉(zhuǎn)換
得到該域的值,此時(shí)還不能直接使用,應(yīng)該再用網(wǎng)絡(luò)到主機(jī)字節(jié)序的轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換:
int x=IPAddress.NetworkToHostOrder(m);
這時(shí)得到的x才是報(bào)文中的實(shí)際值。
第一次用C#做項(xiàng)目,也是第一次發(fā)文,恐難入眾高手法眼,懇請(qǐng)不吝賜教。