C#,BitConverter.ToUInt32,值不正确

时间:2014-01-02 21:19:33

标签: c# bitconverter

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

为什么会出现这种差异?

5 个答案:

答案 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)

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

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

答案 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