我尝试将Ip地址转换为长值:
byte[] Ip = new byte[4] { 192, 168, 1, 0 };
UInt32 Ret1 = (((UInt32)Ip[0]) << 24) |
(((UInt32)Ip[1]) << 16) |
(((UInt32)Ip[2]) << 8) |
(((UInt32)Ip[3]));
UInt32 Ret2 = BitConverter.ToUInt32(Ip, 0);
Ret1返回3232235776
(正确的值)
Ret2返回108736
(?)
为什么会出现这种差异?
答案 0 :(得分:4)
确实,字节顺序是你的问题。虽然不难解决,但在基于英特尔的系统上,由于它们处于 Little Endian ,而网络订单是 Big Endian 。简而言之,您的字节顺序相反。
您可以使用一些方便的方法来解决此问题(甚至在各种平台上):
static uint MakeIPAddressInt32(byte[] array)
{
// Make a defensive copy.
var ipBytes = new byte[array.Length];
array.CopyTo(ipBytes, 0);
// Reverse if we are on a little endian architecture.
if(BitConverter.IsLittleEndian)
Array.Reverse(ipBytes);
// Convert these bytes to an unsigned 32-bit integer (IPv4 address).
return BitConverter.ToUInt32(ipBytes, 0);
}
答案 1 :(得分:2)
听起来你的字节序有问题。
答案 2 :(得分:1)
平台(位度)独立代码可以看起来像这样:
UInt32 Ret2 = BitConverter.ToUInt32(
BitConverter.IsLittleEndian
? Ip.Reverse().ToArray()
: Ip, 0);
答案 3 :(得分:0)
这是一个endian问题。 IPAddress.HostToNetworkOrder有各种重载用于将数字类型转换为其网络等效(即小端到大端)。
答案 4 :(得分:-2)
IP地址通常用网络字节顺序编写,这恰好是标准x86的另一个字节顺序。
Google aton()
,ntoa()
和big endian
。