Ответ 1
Хорошо, я действительно проверил это, поэтому позвольте мне опубликовать это как ответ.
Класс IPAddress
имеет ошибку при отображении адреса на IPv4.
В соответствии с кодом ссылки .NET он делает следующее:
long address =
(((m_Numbers[6] & 0x0000FF00) >> 8) | ((m_Numbers[6] & 0x000000FF) << 8)) |
((((m_Numbers[7] & 0x0000FF00) >> 8) | ((m_Numbers[7] & 0x000000FF) << 8)) << 16);
Проблема должна быть очевидна для всех, кто выполняет побитовые операции в .NET - все числа int
s. Поэтому смещение второго ushort
(m_Numbers[7]
) даст отрицательное значение, поскольку самый старший бит - 1
. Это означает, что все адреса IPv4, заканчивающиеся байтом выше 127
, вызовут ошибку при отображении обратно с IPv6.
Простым исправлением будет следующее:
long address =
(((m_Numbers[6] & 0x0000FF00) >> 8) | ((m_Numbers[6] & 0x000000FF) << 8))
|
(
(uint)(((m_Numbers[7] & 0x0000FF00) >> 8) | ((m_Numbers[7] & 0x000000FF) << 8))
<< 16
);
Просто, переведя int
в uint
, прежде чем делать бит-брейк, делает трюк.
Побитовые операции могут быть довольно сложными, если вы учитываете подписанные типы. Я предполагаю, что код был скопирован из библиотеки С++ или чего-то еще, где эта проблема не будет отображаться.