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