public BigInteger(
byte[] bytes,
int offset,
int length)
{
if (length == 0)
throw new FormatException("Zero length BigInteger");
// TODO Move this processing into MakeMagnitude (provide sign argument)
if ((sbyte)bytes[offset] < 0)
{
this.sign = -1;
int end = offset + length;
int iBval;
// strip leading sign bytes
for (iBval = offset; iBval < end && ((sbyte)bytes[iBval] == -1); iBval++)
{
}
if (iBval >= end)
{
this.magnitude = One.magnitude;
}
else
{
int numBytes = end - iBval;
byte[] inverse = new byte[numBytes];
int index = 0;
while (index < numBytes)
{
inverse[index++] = (byte)~bytes[iBval++];
}
Debug.Assert(iBval == end);
while (inverse[--index] == byte.MaxValue)
{
inverse[index] = byte.MinValue;
}
inverse[index]++;
this.magnitude = MakeMagnitude(inverse, 0, inverse.Length);
}
}
else
{
// strip leading zero bytes and return magnitude bytes
this.magnitude = MakeMagnitude(bytes, offset, length);
this.sign = this.magnitude.Length > 0 ? 1 : 0;
}
}