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