首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 主機與網路位元組序轉換:IPAddress.HostToNetworkOrder 與 NetworkToHostOrder 完整指南

     編輯:關於C#

背景

進行網路開發處理 ISO8583 訊息時,數值型欄位傳輸涉及位元組序轉換。

位元組序基本概念

  • 主機位元組序:低位元組儲存在低記憶體位址,高位元組儲存在高位址(Little Endian,符合人類直覺)。
  • 網路位元組序:高位元組儲存在低位址,低位元組儲存在高位址(Big Endian,TCP/IP 標準,與 CPU/OS 無關)。

封包時將主機序轉網路序;拆包時將網路序轉主機序。

.NET 內建轉換方法

// 主機序 -> 網路序
short/int/long IPAddress.HostToNetworkOrder(short/int/long)

// 網路序 -> 主機序
short/int/long IPAddress.NetworkToHostOrder(short/int/long)

實際範例

int x = 1;        // 主機序:[1][0][0][0] 低位在前
int y = 65536;    // 主機序:[0][0][1][0]

int m = IPAddress.HostToNetworkOrder(x); // 網路序:[0][0][0][1] 高位在前
int n = IPAddress.HostToNetworkOrder(y); // 網路序:[0][1][0][0]

byte[] btValue = BitConverter.GetBytes(m); // 取得 4 位元組陣列寫入封包

// 接收端拆包
int m = BitConverter.ToInt32(btValue, 0);
int x = IPAddress.NetworkToHostOrder(m); // 還原為主機序實際值

補充:CPU 與作業系統位元組序對照

處理器作業系統位元組序
Alpha全部Little Endian
HP-PANTLittle Endian
HP-PAUNIXBig Endian
Intel x86全部Little Endian
Motorola 680x0全部Big Endian
MIPSNTLittle Endian
MIPSUNIXBig Endian
PowerPCNTLittle Endian
PowerPC非 NTBig Endian
RS/6000UNIXBig Endian
SPARCUNIXBig Endian
IXP1200 ARM全部Little Endian

BSD Socket 對應函數

  • htons:unsigned short 主機序→網路序
  • htonl:unsigned long 主機序→網路序
  • ntohs:unsigned short 網路序→主機序
  • ntohl:unsigned long 網路序→主機序

Little Endian 系統會實際轉換;Big Endian 系統定義為空巨集。跨平台開發務必統一位元組序,否則雙方解讀不一致產生 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved