2014-01-02 2 views
3

Я пытаюсь преобразовать IP-адрес в течение длительного значения:C#, BitConverter.ToUInt32, некорректное значение

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

(?)

Почему это различие?

+1

'Ret1 возвращает 3232235776 (правильное значение)'? в соответствии с которым утверждение? Как насчет использования дополнительных API-интерфейсов 'new IPAddress (новый байт [] {192, 168, 1, 0})' –

ответ

4

Действительно, это ваша проблема здесь. В то время как не сложно работать, иногда это может раздражать системы на базе Intel из-за их наличия в Little Endian тогда как Заказ сети is 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); 
} 
+0

Спасибо Array.Reverse это решение! – user2705397

-2

IP адреса обычно пишутся в Сетевой порядок байт который бывает другой порядок байт стандартной архитектуры x86.

Google для aton(), ntoa() и big endian.

+0

Сетевой порядок является большим. Архитектура x86 мало ориентирована. –

+0

Как говорится в ответе: «Сетевой байт» - это другой стандарт стандартного y86. –

1

Платформа (разрядность) независимый код может выглядит озеро:

UInt32 Ret2 = BitConverter.ToUInt32(
        BitConverter.IsLittleEndian 
        ? Ip.Reverse().ToArray() 
        : Ip, 0); 
0

Это проблема конца. IPAddress.HostToNetworkOrder имеет различные перегрузки для преобразования числовых типов в их эквивалентную сеть (т.е. с маленьким эндиантом до большого конца).

Смежные вопросы