3

我尝试将 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(?)

为什么会有这种差异?

4

5 回答 5

4

确实,字节顺序是您的问题。虽然不难解决,但在基于 Intel 的系统上有时会很烦人,因为它们处于Little EndianNetwork OrderBig 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);
} 
于 2014-01-02T21:29:57.820 回答
2

听起来你的字节序有问题。

http://en.wikipedia.org/wiki/Endianness

于 2014-01-02T21:21:11.323 回答
1

平台(位数)独立代码可以看起来像这样:

UInt32 Ret2 = BitConverter.ToUInt32(
                   BitConverter.IsLittleEndian
                   ? Ip.Reverse().ToArray()
                   : Ip, 0);
于 2014-01-02T21:30:12.927 回答
0

这是一个字节序问题。IPAddress.HostToNetworkOrder有各种重载将数字类型转换为它们的网络等值(即小端到大端)。

于 2014-01-03T08:58:10.960 回答
-2

IP 地址通常以网络字节顺序编写,这恰好是标准 x86 的另一个字节序。

谷歌搜索aton(),ntoa()big endian.

于 2014-01-02T21:23:14.370 回答