parent
e4644599af
commit
998017a76d
@ -1,167 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Numerics;
|
||||
using System.Text;
|
||||
|
||||
namespace Emby.Server.Implementations.Networking.IPNetwork
|
||||
{
|
||||
/// <summary>
|
||||
/// Extension methods to convert <see cref="BigInteger"/>
|
||||
/// instances to hexadecimal, octal, and binary strings.
|
||||
/// </summary>
|
||||
public static class BigIntegerExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Converts a <see cref="BigInteger"/> to a binary string.
|
||||
/// </summary>
|
||||
/// <param name="bigint">A <see cref="BigInteger"/>.</param>
|
||||
/// <returns>
|
||||
/// A <see cref="string"/> containing a binary
|
||||
/// representation of the supplied <see cref="BigInteger"/>.
|
||||
/// </returns>
|
||||
public static string ToBinaryString(this BigInteger bigint)
|
||||
{
|
||||
var bytes = bigint.ToByteArray();
|
||||
var idx = bytes.Length - 1;
|
||||
|
||||
// Create a StringBuilder having appropriate capacity.
|
||||
var base2 = new StringBuilder(bytes.Length * 8);
|
||||
|
||||
// Convert first byte to binary.
|
||||
var binary = Convert.ToString(bytes[idx], 2);
|
||||
|
||||
// Ensure leading zero exists if value is positive.
|
||||
if (binary[0] != '0' && bigint.Sign == 1)
|
||||
{
|
||||
base2.Append('0');
|
||||
}
|
||||
|
||||
// Append binary string to StringBuilder.
|
||||
base2.Append(binary);
|
||||
|
||||
// Convert remaining bytes adding leading zeros.
|
||||
for (idx--; idx >= 0; idx--)
|
||||
{
|
||||
base2.Append(Convert.ToString(bytes[idx], 2).PadLeft(8, '0'));
|
||||
}
|
||||
|
||||
return base2.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a <see cref="BigInteger"/> to a hexadecimal string.
|
||||
/// </summary>
|
||||
/// <param name="bigint">A <see cref="BigInteger"/>.</param>
|
||||
/// <returns>
|
||||
/// A <see cref="string"/> containing a hexadecimal
|
||||
/// representation of the supplied <see cref="BigInteger"/>.
|
||||
/// </returns>
|
||||
public static string ToHexadecimalString(this BigInteger bigint)
|
||||
{
|
||||
return bigint.ToString("X");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a <see cref="BigInteger"/> to a octal string.
|
||||
/// </summary>
|
||||
/// <param name="bigint">A <see cref="BigInteger"/>.</param>
|
||||
/// <returns>
|
||||
/// A <see cref="string"/> containing an octal
|
||||
/// representation of the supplied <see cref="BigInteger"/>.
|
||||
/// </returns>
|
||||
public static string ToOctalString(this BigInteger bigint)
|
||||
{
|
||||
var bytes = bigint.ToByteArray();
|
||||
var idx = bytes.Length - 1;
|
||||
|
||||
// Create a StringBuilder having appropriate capacity.
|
||||
var base8 = new StringBuilder(((bytes.Length / 3) + 1) * 8);
|
||||
|
||||
// Calculate how many bytes are extra when byte array is split
|
||||
// into three-byte (24-bit) chunks.
|
||||
var extra = bytes.Length % 3;
|
||||
|
||||
// If no bytes are extra, use three bytes for first chunk.
|
||||
if (extra == 0)
|
||||
{
|
||||
extra = 3;
|
||||
}
|
||||
|
||||
// Convert first chunk (24-bits) to integer value.
|
||||
int int24 = 0;
|
||||
for (; extra != 0; extra--)
|
||||
{
|
||||
int24 <<= 8;
|
||||
int24 += bytes[idx--];
|
||||
}
|
||||
|
||||
// Convert 24-bit integer to octal without adding leading zeros.
|
||||
var octal = Convert.ToString(int24, 8);
|
||||
|
||||
// Ensure leading zero exists if value is positive.
|
||||
if (octal[0] != '0')
|
||||
{
|
||||
if (bigint.Sign == 1)
|
||||
{
|
||||
base8.Append('0');
|
||||
}
|
||||
}
|
||||
|
||||
// Append first converted chunk to StringBuilder.
|
||||
base8.Append(octal);
|
||||
|
||||
// Convert remaining 24-bit chunks, adding leading zeros.
|
||||
for (; idx >= 0; idx -= 3)
|
||||
{
|
||||
int24 = (bytes[idx] << 16) + (bytes[idx - 1] << 8) + bytes[idx - 2];
|
||||
base8.Append(Convert.ToString(int24, 8).PadLeft(8, '0'));
|
||||
}
|
||||
|
||||
return base8.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Reverse a Positive BigInteger ONLY
|
||||
/// Bitwise ~ operator
|
||||
///
|
||||
/// Input : FF FF FF FF
|
||||
/// Width : 4
|
||||
/// Result : 00 00 00 00
|
||||
///
|
||||
///
|
||||
/// Input : 00 00 00 00
|
||||
/// Width : 4
|
||||
/// Result : FF FF FF FF
|
||||
///
|
||||
/// Input : FF FF FF FF
|
||||
/// Width : 8
|
||||
/// Result : FF FF FF FF 00 00 00 00
|
||||
///
|
||||
///
|
||||
/// Input : 00 00 00 00
|
||||
/// Width : 8
|
||||
/// Result : FF FF FF FF FF FF FF FF
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <param name="width"></param>
|
||||
/// <returns></returns>
|
||||
public static BigInteger PositiveReverse(this BigInteger input, int width)
|
||||
{
|
||||
|
||||
var result = new List<byte>();
|
||||
var bytes = input.ToByteArray();
|
||||
var work = new byte[width];
|
||||
Array.Copy(bytes, 0, work, 0, bytes.Length - 1); // Length -1 : positive BigInteger
|
||||
|
||||
for (int i = 0; i < work.Length; i++)
|
||||
{
|
||||
result.Add((byte)(~work[i]));
|
||||
}
|
||||
result.Add(0); // positive BigInteger
|
||||
return new BigInteger(result.ToArray());
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,94 +0,0 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Numerics;
|
||||
|
||||
namespace Emby.Server.Implementations.Networking.IPNetwork
|
||||
{
|
||||
public class IPAddressCollection : IEnumerable<IPAddress>, IEnumerator<IPAddress>
|
||||
{
|
||||
|
||||
private IPNetwork _ipnetwork;
|
||||
private BigInteger _enumerator;
|
||||
|
||||
internal IPAddressCollection(IPNetwork ipnetwork)
|
||||
{
|
||||
this._ipnetwork = ipnetwork;
|
||||
this._enumerator = -1;
|
||||
}
|
||||
|
||||
|
||||
#region Count, Array, Enumerator
|
||||
|
||||
public BigInteger Count => this._ipnetwork.Total;
|
||||
|
||||
public IPAddress this[BigInteger i]
|
||||
{
|
||||
get
|
||||
{
|
||||
if (i >= this.Count)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(i));
|
||||
}
|
||||
byte width = this._ipnetwork.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? (byte)32 : (byte)128;
|
||||
var ipn = this._ipnetwork.Subnet(width);
|
||||
return ipn[i].Network;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable Members
|
||||
|
||||
IEnumerator<IPAddress> IEnumerable<IPAddress>.GetEnumerator()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
#region IEnumerator<IPNetwork> Members
|
||||
|
||||
public IPAddress Current => this[this._enumerator];
|
||||
|
||||
#endregion
|
||||
|
||||
#region IDisposable Members
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
// nothing to dispose
|
||||
return;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerator Members
|
||||
|
||||
object IEnumerator.Current => this.Current;
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
this._enumerator++;
|
||||
if (this._enumerator >= this.Count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
this._enumerator = -1;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,129 +0,0 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Numerics;
|
||||
|
||||
namespace Emby.Server.Implementations.Networking.IPNetwork
|
||||
{
|
||||
public class IPNetworkCollection : IEnumerable<IPNetwork>, IEnumerator<IPNetwork>
|
||||
{
|
||||
|
||||
private BigInteger _enumerator;
|
||||
private byte _cidrSubnet;
|
||||
private IPNetwork _ipnetwork;
|
||||
|
||||
private byte _cidr => this._ipnetwork.Cidr;
|
||||
|
||||
private BigInteger _broadcast => IPNetwork.ToBigInteger(this._ipnetwork.Broadcast);
|
||||
|
||||
private BigInteger _lastUsable => IPNetwork.ToBigInteger(this._ipnetwork.LastUsable);
|
||||
private BigInteger _network => IPNetwork.ToBigInteger(this._ipnetwork.Network);
|
||||
#if TRAVISCI
|
||||
public
|
||||
#else
|
||||
internal
|
||||
#endif
|
||||
IPNetworkCollection(IPNetwork ipnetwork, byte cidrSubnet)
|
||||
{
|
||||
|
||||
int maxCidr = ipnetwork.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? 32 : 128;
|
||||
if (cidrSubnet > maxCidr)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(cidrSubnet));
|
||||
}
|
||||
|
||||
if (cidrSubnet < ipnetwork.Cidr)
|
||||
{
|
||||
throw new ArgumentException("cidr");
|
||||
}
|
||||
|
||||
this._cidrSubnet = cidrSubnet;
|
||||
this._ipnetwork = ipnetwork;
|
||||
this._enumerator = -1;
|
||||
}
|
||||
|
||||
#region Count, Array, Enumerator
|
||||
|
||||
public BigInteger Count
|
||||
{
|
||||
get
|
||||
{
|
||||
var count = BigInteger.Pow(2, this._cidrSubnet - this._cidr);
|
||||
return count;
|
||||
}
|
||||
}
|
||||
|
||||
public IPNetwork this[BigInteger i]
|
||||
{
|
||||
get
|
||||
{
|
||||
if (i >= this.Count)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(i));
|
||||
}
|
||||
|
||||
var last = this._ipnetwork.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6
|
||||
? this._lastUsable : this._broadcast;
|
||||
var increment = (last - this._network) / this.Count;
|
||||
var uintNetwork = this._network + ((increment + 1) * i);
|
||||
var ipn = new IPNetwork(uintNetwork, this._ipnetwork.AddressFamily, this._cidrSubnet);
|
||||
return ipn;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable Members
|
||||
|
||||
IEnumerator<IPNetwork> IEnumerable<IPNetwork>.GetEnumerator()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
#region IEnumerator<IPNetwork> Members
|
||||
|
||||
public IPNetwork Current => this[this._enumerator];
|
||||
|
||||
#endregion
|
||||
|
||||
#region IDisposable Members
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
// nothing to dispose
|
||||
return;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerator Members
|
||||
|
||||
object IEnumerator.Current => this.Current;
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
this._enumerator++;
|
||||
if (this._enumerator >= this.Count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
this._enumerator = -1;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
Copyright (c) 2015, lduchosal
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
Loading…
Reference in new issue