Collection of Miscellaneous Byte Helper Functions
public static class MiscByte
{
public static byte[] Add(this byte[] left, byte[] right)
{
var l1 = left.Length;
var l2 = right.Length;
if (l1 > 0 && l2 > 0)
{
var ret = new byte[l1 + l2];
Buffer.BlockCopy(left, 0, ret, 0, l1);
Buffer.BlockCopy(right, 0, ret, l1, l2);
return ret;
}
if (l1 > 0 && l2 == 0)
return left;
if (l2 > 0 && l1 == 0)
return right;
return new byte[0];
}
public static byte[] XOR(this byte[] left, byte[] right)
{
var l1 = left.Length;
var l2 = right.Length;
if (l1 != l2)
throw new Exception("Error: left and right arrays lengths must be equal.");
var ret = new byte[l1];
for (var i = 0; i < l1; ++i)
ret[i] = (byte)((left[i] ^ right[i]) & 0xff);
return ret;
}
public static byte[] OR(this byte[] left, byte[] right)
{
var l1 = left.Length;
var l2 = right.Length;
if (l1 != l2)
throw new Exception("Error: left and right arrays lengths must be equal.");
var ret = new byte[l1];
for (var i = 0; i < l1; ++i)
ret[i] = (byte)((left[i] | right[i]) & 0xff);
return ret;
}
public static byte[] AND(this byte[] left, byte[] right)
{
var l1 = left.Length;
var l2 = right.Length;
if (l1 != l2)
throw new Exception("Error: left and right arrays lengths must be equal.");
var ret = new byte[l1];
for (var i = 0; i < l1; ++i)
ret[i] = (byte)(left[i] & right[i] & 0xff);
return ret;
}
public static byte[] NOT(this byte[] left)
{
var l1 = left.Length;
var ret = new byte[l1];
for (var i = 0; i < l1; ++i)
ret[i] = (byte)((ushort)~left[i] & 0xff);
return ret;
}
[SecuritySafeCritical]
public static unsafe byte[] Clone(this byte[] a1)
{
if (a1 == null)
return null;
var a2 = new byte[a1.Length];
fixed (byte* p1 = a1, p2 = a2)
{
var Len = a1.Length;
byte* x1 = p1, x2 = p2;
while (Len > 7)
{
*(long*)x2 = *(long*)x1;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 6:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
break;
case 5:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*x2 = *x1;
break;
case 4:
*(int*)x2 = *(int*)x1;
break;
case 3:
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 2:
*(short*)x2 = *(short*)x1;
break;
case 1:
*x2 = *x1;
break;
}
return a2;
}
}
[SecuritySafeCritical]
public static unsafe bool Copy(this byte[] a1, int aindex, byte[] a2, int bindex, int length)
{
if (a1 == null || a2 == null)
return false;
fixed (byte* p1 = a1, p2 = a2)
{
var Len = length;
byte* x1 = p1 + aindex, x2 = p2 + bindex;
while (Len > 7)
{
*(long*)x2 = *(long*)x1;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 6:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
break;
case 5:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*x2 = *x1;
break;
case 4:
*(int*)x2 = *(int*)x1;
break;
case 3:
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 2:
*(short*)x2 = *(short*)x1;
break;
case 1:
*x2 = *x1;
break;
}
return true;
}
}
[SecuritySafeCritical]
public static unsafe byte[] SubByte(this byte[] a1, int aindex, int length)
{
if (a1 == null)
return null;
if (aindex + length > a1.Length)
throw new Exception("Error: SubByte - index + length exceed source array length.");
var a2 = new byte[length];
fixed (byte* p1 = a1, p2 = a2)
{
var Len = length;
byte* x1 = p1 + aindex, x2 = p2;
while (Len > 7)
{
*(long*)x2 = *(long*)x1;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 6:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
break;
case 5:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*x2 = *x1;
break;
case 4:
*(int*)x2 = *(int*)x1;
break;
case 3:
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 2:
*(short*)x2 = *(short*)x1;
break;
case 1:
*x2 = *x1;
break;
}
return a2;
}
}
[SecuritySafeCritical]
public static byte[] CloneTo(this byte[] a1)
{
var a1l = a1.Length;
var copy = new byte[a1l];
a1.Copy(copy);
return copy;
}
[SecuritySafeCritical]
public static unsafe bool Copy(this byte[] a1, byte[] a2)
{
if (a1 == null || a2 == null || a1.Length != a2.Length)
return false;
fixed (byte* p1 = a1, p2 = a2)
{
var Len = a1.Length;
byte* x1 = p1, x2 = p2;
while (Len > 7)
{
*(long*)x2 = *(long*)x1;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 6:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
break;
case 5:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*x2 = *x1;
break;
case 4:
*(int*)x2 = *(int*)x1;
break;
case 3:
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 2:
*(short*)x2 = *(short*)x1;
break;
case 1:
*x2 = *x1;
break;
}
return true;
}
}
public static bool Compare(this short[] a1, short[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this byte[] a1, short[] a2)
{
var b2 = a2.GetBytes();
return a1.Compare(b2);
}
public static bool Compare(this ushort[] a1, ushort[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this int[] a1, int[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this uint[] a1, uint[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this long[] a1, long[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this ulong[] a1, ulong[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this double[] a1, double[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this float[] a1, float[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
[SecuritySafeCritical]
public static unsafe bool Compare(this byte[] a1, byte[] a2)
{
if (a1 == null && a2 == null)
return true;
if (a1 == null || a2 == null || a1.Length != a2.Length)
return false;
fixed (byte* p1 = a1, p2 = a2)
{
var Len = a1.Length;
byte* x1 = p1, x2 = p2;
while (Len > 7)
{
if (*(long*)x2 != *(long*)x1)
return false;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
if (*(int*)x2 != *(int*)x1)
return false;
x1 += 4;
x2 += 4;
if (*(short*)x2 != *(short*)x1)
return false;
x1 += 2;
x2 += 2;
if (*x2 != *x1)
return false;
break;
case 6:
if (*(int*)x2 != *(int*)x1)
return false;
x1 += 4;
x2 += 4;
if (*(short*)x2 != *(short*)x1)
return false;
break;
case 5:
if (*(int*)x2 != *(int*)x1)
return false;
x1 += 4;
x2 += 4;
if (*x2 != *x1)
return false;
break;
case 4:
if (*(int*)x2 != *(int*)x1)
return false;
break;
case 3:
if (*(short*)x2 != *(short*)x1)
return false;
x1 += 2;
x2 += 2;
if (*x2 != *x1)
return false;
break;
case 2:
if (*(short*)x2 != *(short*)x1)
return false;
break;
case 1:
if (*x2 != *x1)
return false;
break;
}
return true;
}
}
[SecuritySafeCritical]
public static unsafe bool Fill(this byte[] a1, byte b1)
{
if (a1 == null)
return false;
byte[] fbl = { b1, b1, b1, b1, b1, b1, b1, b1 };
byte[] fbi = { b1, b1, b1, b1 };
byte[] fbs = { b1, b1 };
byte[] fbb = { b1 };
fixed (byte* p1 = a1, p8 = fbl, p4 = fbi, p2 = fbs, p0 = fbb)
{
var Len = a1.Length;
var x1 = p1;
while (Len > 7)
{
*(long*)x1 = *(long*)p8;
x1 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x1 = *(int*)p4;
x1 += 4;
*(short*)x1 = *(short*)p2;
x1 += 2;
*x1 = *p0;
break;
case 6:
*(int*)x1 = *(int*)p4;
x1 += 4;
*(short*)x1 = *(short*)p2;
break;
case 5:
*(int*)x1 = *(int*)p4;
x1 += 4;
*x1 = *p0;
break;
case 4:
*(int*)x1 = *(int*)p4;
break;
case 3:
*(short*)x1 = *(short*)p2;
x1 += 2;
*x1 = *p0;
break;
case 2:
*(short*)x1 = *(short*)p2;
break;
case 1:
*x1 = *p0;
break;
}
return true;
}
}
[SecuritySafeCritical]
public static unsafe bool Fill(this int[] a1, int i1)
{
if (a1 == null)
return false;
int[] fbl = { i1, i1 };
int[] fbi = { i1 };
fixed (int* p1 = a1, p8 = fbl, p4 = fbi)
{
var Len = a1.Length;
var x1 = p1;
while (Len > 1)
{
*(long*)x1 = *(long*)p8;
x1 += 2;
Len -= 2;
}
if (Len == 1)
*x1 = *p4;
return true;
}
}
[SecuritySafeCritical]
public static unsafe bool Fill(this long[] a1, long i1)
{
if (a1 == null)
return false;
long[] fbi = { i1 };
fixed (long* p1 = a1, p = fbi)
{
var Len = a1.Length;
var x1 = p1;
while (Len > 1)
{
*x1 = *p;
x1 += 1;
Len -= 1;
}
return true;
}
}
[SecuritySafeCritical]
public static unsafe bool Fill(this ulong[] a1, ulong i1)
{
if (a1 == null)
return false;
ulong[] fbi = { i1 };
fixed (ulong* p1 = a1, p = fbi)
{
var Len = a1.Length;
var x1 = p1;
while (Len > 1)
{
*x1 = *p;
x1 += 1;
Len -= 1;
}
return true;
}
}
}
public static class MiscByte
{
public static byte[] Add(this byte[] left, byte[] right)
{
var l1 = left.Length;
var l2 = right.Length;
if (l1 > 0 && l2 > 0)
{
var ret = new byte[l1 + l2];
Buffer.BlockCopy(left, 0, ret, 0, l1);
Buffer.BlockCopy(right, 0, ret, l1, l2);
return ret;
}
if (l1 > 0 && l2 == 0)
return left;
if (l2 > 0 && l1 == 0)
return right;
return new byte[0];
}
public static byte[] XOR(this byte[] left, byte[] right)
{
var l1 = left.Length;
var l2 = right.Length;
if (l1 != l2)
throw new Exception("Error: left and right arrays lengths must be equal.");
var ret = new byte[l1];
for (var i = 0; i < l1; ++i)
ret[i] = (byte)((left[i] ^ right[i]) & 0xff);
return ret;
}
public static byte[] OR(this byte[] left, byte[] right)
{
var l1 = left.Length;
var l2 = right.Length;
if (l1 != l2)
throw new Exception("Error: left and right arrays lengths must be equal.");
var ret = new byte[l1];
for (var i = 0; i < l1; ++i)
ret[i] = (byte)((left[i] | right[i]) & 0xff);
return ret;
}
public static byte[] AND(this byte[] left, byte[] right)
{
var l1 = left.Length;
var l2 = right.Length;
if (l1 != l2)
throw new Exception("Error: left and right arrays lengths must be equal.");
var ret = new byte[l1];
for (var i = 0; i < l1; ++i)
ret[i] = (byte)(left[i] & right[i] & 0xff);
return ret;
}
public static byte[] NOT(this byte[] left)
{
var l1 = left.Length;
var ret = new byte[l1];
for (var i = 0; i < l1; ++i)
ret[i] = (byte)((ushort)~left[i] & 0xff);
return ret;
}
[SecuritySafeCritical]
public static unsafe byte[] Clone(this byte[] a1)
{
if (a1 == null)
return null;
var a2 = new byte[a1.Length];
fixed (byte* p1 = a1, p2 = a2)
{
var Len = a1.Length;
byte* x1 = p1, x2 = p2;
while (Len > 7)
{
*(long*)x2 = *(long*)x1;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 6:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
break;
case 5:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*x2 = *x1;
break;
case 4:
*(int*)x2 = *(int*)x1;
break;
case 3:
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 2:
*(short*)x2 = *(short*)x1;
break;
case 1:
*x2 = *x1;
break;
}
return a2;
}
}
[SecuritySafeCritical]
public static unsafe bool Copy(this byte[] a1, int aindex, byte[] a2, int bindex, int length)
{
if (a1 == null || a2 == null)
return false;
fixed (byte* p1 = a1, p2 = a2)
{
var Len = length;
byte* x1 = p1 + aindex, x2 = p2 + bindex;
while (Len > 7)
{
*(long*)x2 = *(long*)x1;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 6:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
break;
case 5:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*x2 = *x1;
break;
case 4:
*(int*)x2 = *(int*)x1;
break;
case 3:
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 2:
*(short*)x2 = *(short*)x1;
break;
case 1:
*x2 = *x1;
break;
}
return true;
}
}
[SecuritySafeCritical]
public static unsafe byte[] SubByte(this byte[] a1, int aindex, int length)
{
if (a1 == null)
return null;
if (aindex + length > a1.Length)
throw new Exception("Error: SubByte - index + length exceed source array length.");
var a2 = new byte[length];
fixed (byte* p1 = a1, p2 = a2)
{
var Len = length;
byte* x1 = p1 + aindex, x2 = p2;
while (Len > 7)
{
*(long*)x2 = *(long*)x1;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 6:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
break;
case 5:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*x2 = *x1;
break;
case 4:
*(int*)x2 = *(int*)x1;
break;
case 3:
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 2:
*(short*)x2 = *(short*)x1;
break;
case 1:
*x2 = *x1;
break;
}
return a2;
}
}
[SecuritySafeCritical]
public static byte[] CloneTo(this byte[] a1)
{
var a1l = a1.Length;
var copy = new byte[a1l];
a1.Copy(copy);
return copy;
}
[SecuritySafeCritical]
public static unsafe bool Copy(this byte[] a1, byte[] a2)
{
if (a1 == null || a2 == null || a1.Length != a2.Length)
return false;
fixed (byte* p1 = a1, p2 = a2)
{
var Len = a1.Length;
byte* x1 = p1, x2 = p2;
while (Len > 7)
{
*(long*)x2 = *(long*)x1;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 6:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*(short*)x2 = *(short*)x1;
break;
case 5:
*(int*)x2 = *(int*)x1;
x1 += 4;
x2 += 4;
*x2 = *x1;
break;
case 4:
*(int*)x2 = *(int*)x1;
break;
case 3:
*(short*)x2 = *(short*)x1;
x1 += 2;
x2 += 2;
*x2 = *x1;
break;
case 2:
*(short*)x2 = *(short*)x1;
break;
case 1:
*x2 = *x1;
break;
}
return true;
}
}
public static bool Compare(this short[] a1, short[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this byte[] a1, short[] a2)
{
var b2 = a2.GetBytes();
return a1.Compare(b2);
}
public static bool Compare(this ushort[] a1, ushort[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this int[] a1, int[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this uint[] a1, uint[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this long[] a1, long[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this ulong[] a1, ulong[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this double[] a1, double[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
public static bool Compare(this float[] a1, float[] a2)
{
var b1 = a1.GetBytes();
var b2 = a2.GetBytes();
return b1.Compare(b2);
}
[SecuritySafeCritical]
public static unsafe bool Compare(this byte[] a1, byte[] a2)
{
if (a1 == null && a2 == null)
return true;
if (a1 == null || a2 == null || a1.Length != a2.Length)
return false;
fixed (byte* p1 = a1, p2 = a2)
{
var Len = a1.Length;
byte* x1 = p1, x2 = p2;
while (Len > 7)
{
if (*(long*)x2 != *(long*)x1)
return false;
x1 += 8;
x2 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
if (*(int*)x2 != *(int*)x1)
return false;
x1 += 4;
x2 += 4;
if (*(short*)x2 != *(short*)x1)
return false;
x1 += 2;
x2 += 2;
if (*x2 != *x1)
return false;
break;
case 6:
if (*(int*)x2 != *(int*)x1)
return false;
x1 += 4;
x2 += 4;
if (*(short*)x2 != *(short*)x1)
return false;
break;
case 5:
if (*(int*)x2 != *(int*)x1)
return false;
x1 += 4;
x2 += 4;
if (*x2 != *x1)
return false;
break;
case 4:
if (*(int*)x2 != *(int*)x1)
return false;
break;
case 3:
if (*(short*)x2 != *(short*)x1)
return false;
x1 += 2;
x2 += 2;
if (*x2 != *x1)
return false;
break;
case 2:
if (*(short*)x2 != *(short*)x1)
return false;
break;
case 1:
if (*x2 != *x1)
return false;
break;
}
return true;
}
}
[SecuritySafeCritical]
public static unsafe bool Fill(this byte[] a1, byte b1)
{
if (a1 == null)
return false;
byte[] fbl = { b1, b1, b1, b1, b1, b1, b1, b1 };
byte[] fbi = { b1, b1, b1, b1 };
byte[] fbs = { b1, b1 };
byte[] fbb = { b1 };
fixed (byte* p1 = a1, p8 = fbl, p4 = fbi, p2 = fbs, p0 = fbb)
{
var Len = a1.Length;
var x1 = p1;
while (Len > 7)
{
*(long*)x1 = *(long*)p8;
x1 += 8;
Len -= 8;
}
switch (Len % 8)
{
case 0:
break;
case 7:
*(int*)x1 = *(int*)p4;
x1 += 4;
*(short*)x1 = *(short*)p2;
x1 += 2;
*x1 = *p0;
break;
case 6:
*(int*)x1 = *(int*)p4;
x1 += 4;
*(short*)x1 = *(short*)p2;
break;
case 5:
*(int*)x1 = *(int*)p4;
x1 += 4;
*x1 = *p0;
break;
case 4:
*(int*)x1 = *(int*)p4;
break;
case 3:
*(short*)x1 = *(short*)p2;
x1 += 2;
*x1 = *p0;
break;
case 2:
*(short*)x1 = *(short*)p2;
break;
case 1:
*x1 = *p0;
break;
}
return true;
}
}
[SecuritySafeCritical]
public static unsafe bool Fill(this int[] a1, int i1)
{
if (a1 == null)
return false;
int[] fbl = { i1, i1 };
int[] fbi = { i1 };
fixed (int* p1 = a1, p8 = fbl, p4 = fbi)
{
var Len = a1.Length;
var x1 = p1;
while (Len > 1)
{
*(long*)x1 = *(long*)p8;
x1 += 2;
Len -= 2;
}
if (Len == 1)
*x1 = *p4;
return true;
}
}
[SecuritySafeCritical]
public static unsafe bool Fill(this long[] a1, long i1)
{
if (a1 == null)
return false;
long[] fbi = { i1 };
fixed (long* p1 = a1, p = fbi)
{
var Len = a1.Length;
var x1 = p1;
while (Len > 1)
{
*x1 = *p;
x1 += 1;
Len -= 1;
}
return true;
}
}
[SecuritySafeCritical]
public static unsafe bool Fill(this ulong[] a1, ulong i1)
{
if (a1 == null)
return false;
ulong[] fbi = { i1 };
fixed (ulong* p1 = a1, p = fbi)
{
var Len = a1.Length;
var x1 = p1;
while (Len > 1)
{
*x1 = *p;
x1 += 1;
Len -= 1;
}
return true;
}
}
}
public static class MiscByte { public static byte[] Add(this byte[] left, byte[] right) { var l1 = left.Length; var l2 = right.Length; if (l1 > 0 && l2 > 0) { var ret = new byte[l1 + l2]; Buffer.BlockCopy(left, 0, ret, 0, l1); Buffer.BlockCopy(right, 0, ret, l1, l2); return ret; } if (l1 > 0 && l2 == 0) return left; if (l2 > 0 && l1 == 0) return right; return new byte[0]; } public static byte[] XOR(this byte[] left, byte[] right) { var l1 = left.Length; var l2 = right.Length; if (l1 != l2) throw new Exception("Error: left and right arrays lengths must be equal."); var ret = new byte[l1]; for (var i = 0; i < l1; ++i) ret[i] = (byte)((left[i] ^ right[i]) & 0xff); return ret; } public static byte[] OR(this byte[] left, byte[] right) { var l1 = left.Length; var l2 = right.Length; if (l1 != l2) throw new Exception("Error: left and right arrays lengths must be equal."); var ret = new byte[l1]; for (var i = 0; i < l1; ++i) ret[i] = (byte)((left[i] | right[i]) & 0xff); return ret; } public static byte[] AND(this byte[] left, byte[] right) { var l1 = left.Length; var l2 = right.Length; if (l1 != l2) throw new Exception("Error: left and right arrays lengths must be equal."); var ret = new byte[l1]; for (var i = 0; i < l1; ++i) ret[i] = (byte)(left[i] & right[i] & 0xff); return ret; } public static byte[] NOT(this byte[] left) { var l1 = left.Length; var ret = new byte[l1]; for (var i = 0; i < l1; ++i) ret[i] = (byte)((ushort)~left[i] & 0xff); return ret; } [SecuritySafeCritical] public static unsafe byte[] Clone(this byte[] a1) { if (a1 == null) return null; var a2 = new byte[a1.Length]; fixed (byte* p1 = a1, p2 = a2) { var Len = a1.Length; byte* x1 = p1, x2 = p2; while (Len > 7) { *(long*)x2 = *(long*)x1; x1 += 8; x2 += 8; Len -= 8; } switch (Len % 8) { case 0: break; case 7: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *(short*)x2 = *(short*)x1; x1 += 2; x2 += 2; *x2 = *x1; break; case 6: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *(short*)x2 = *(short*)x1; break; case 5: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *x2 = *x1; break; case 4: *(int*)x2 = *(int*)x1; break; case 3: *(short*)x2 = *(short*)x1; x1 += 2; x2 += 2; *x2 = *x1; break; case 2: *(short*)x2 = *(short*)x1; break; case 1: *x2 = *x1; break; } return a2; } } [SecuritySafeCritical] public static unsafe bool Copy(this byte[] a1, int aindex, byte[] a2, int bindex, int length) { if (a1 == null || a2 == null) return false; fixed (byte* p1 = a1, p2 = a2) { var Len = length; byte* x1 = p1 + aindex, x2 = p2 + bindex; while (Len > 7) { *(long*)x2 = *(long*)x1; x1 += 8; x2 += 8; Len -= 8; } switch (Len % 8) { case 0: break; case 7: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *(short*)x2 = *(short*)x1; x1 += 2; x2 += 2; *x2 = *x1; break; case 6: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *(short*)x2 = *(short*)x1; break; case 5: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *x2 = *x1; break; case 4: *(int*)x2 = *(int*)x1; break; case 3: *(short*)x2 = *(short*)x1; x1 += 2; x2 += 2; *x2 = *x1; break; case 2: *(short*)x2 = *(short*)x1; break; case 1: *x2 = *x1; break; } return true; } } [SecuritySafeCritical] public static unsafe byte[] SubByte(this byte[] a1, int aindex, int length) { if (a1 == null) return null; if (aindex + length > a1.Length) throw new Exception("Error: SubByte - index + length exceed source array length."); var a2 = new byte[length]; fixed (byte* p1 = a1, p2 = a2) { var Len = length; byte* x1 = p1 + aindex, x2 = p2; while (Len > 7) { *(long*)x2 = *(long*)x1; x1 += 8; x2 += 8; Len -= 8; } switch (Len % 8) { case 0: break; case 7: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *(short*)x2 = *(short*)x1; x1 += 2; x2 += 2; *x2 = *x1; break; case 6: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *(short*)x2 = *(short*)x1; break; case 5: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *x2 = *x1; break; case 4: *(int*)x2 = *(int*)x1; break; case 3: *(short*)x2 = *(short*)x1; x1 += 2; x2 += 2; *x2 = *x1; break; case 2: *(short*)x2 = *(short*)x1; break; case 1: *x2 = *x1; break; } return a2; } } [SecuritySafeCritical] public static byte[] CloneTo(this byte[] a1) { var a1l = a1.Length; var copy = new byte[a1l]; a1.Copy(copy); return copy; } [SecuritySafeCritical] public static unsafe bool Copy(this byte[] a1, byte[] a2) { if (a1 == null || a2 == null || a1.Length != a2.Length) return false; fixed (byte* p1 = a1, p2 = a2) { var Len = a1.Length; byte* x1 = p1, x2 = p2; while (Len > 7) { *(long*)x2 = *(long*)x1; x1 += 8; x2 += 8; Len -= 8; } switch (Len % 8) { case 0: break; case 7: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *(short*)x2 = *(short*)x1; x1 += 2; x2 += 2; *x2 = *x1; break; case 6: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *(short*)x2 = *(short*)x1; break; case 5: *(int*)x2 = *(int*)x1; x1 += 4; x2 += 4; *x2 = *x1; break; case 4: *(int*)x2 = *(int*)x1; break; case 3: *(short*)x2 = *(short*)x1; x1 += 2; x2 += 2; *x2 = *x1; break; case 2: *(short*)x2 = *(short*)x1; break; case 1: *x2 = *x1; break; } return true; } } public static bool Compare(this short[] a1, short[] a2) { var b1 = a1.GetBytes(); var b2 = a2.GetBytes(); return b1.Compare(b2); } public static bool Compare(this byte[] a1, short[] a2) { var b2 = a2.GetBytes(); return a1.Compare(b2); } public static bool Compare(this ushort[] a1, ushort[] a2) { var b1 = a1.GetBytes(); var b2 = a2.GetBytes(); return b1.Compare(b2); } public static bool Compare(this int[] a1, int[] a2) { var b1 = a1.GetBytes(); var b2 = a2.GetBytes(); return b1.Compare(b2); } public static bool Compare(this uint[] a1, uint[] a2) { var b1 = a1.GetBytes(); var b2 = a2.GetBytes(); return b1.Compare(b2); } public static bool Compare(this long[] a1, long[] a2) { var b1 = a1.GetBytes(); var b2 = a2.GetBytes(); return b1.Compare(b2); } public static bool Compare(this ulong[] a1, ulong[] a2) { var b1 = a1.GetBytes(); var b2 = a2.GetBytes(); return b1.Compare(b2); } public static bool Compare(this double[] a1, double[] a2) { var b1 = a1.GetBytes(); var b2 = a2.GetBytes(); return b1.Compare(b2); } public static bool Compare(this float[] a1, float[] a2) { var b1 = a1.GetBytes(); var b2 = a2.GetBytes(); return b1.Compare(b2); } [SecuritySafeCritical] public static unsafe bool Compare(this byte[] a1, byte[] a2) { if (a1 == null && a2 == null) return true; if (a1 == null || a2 == null || a1.Length != a2.Length) return false; fixed (byte* p1 = a1, p2 = a2) { var Len = a1.Length; byte* x1 = p1, x2 = p2; while (Len > 7) { if (*(long*)x2 != *(long*)x1) return false; x1 += 8; x2 += 8; Len -= 8; } switch (Len % 8) { case 0: break; case 7: if (*(int*)x2 != *(int*)x1) return false; x1 += 4; x2 += 4; if (*(short*)x2 != *(short*)x1) return false; x1 += 2; x2 += 2; if (*x2 != *x1) return false; break; case 6: if (*(int*)x2 != *(int*)x1) return false; x1 += 4; x2 += 4; if (*(short*)x2 != *(short*)x1) return false; break; case 5: if (*(int*)x2 != *(int*)x1) return false; x1 += 4; x2 += 4; if (*x2 != *x1) return false; break; case 4: if (*(int*)x2 != *(int*)x1) return false; break; case 3: if (*(short*)x2 != *(short*)x1) return false; x1 += 2; x2 += 2; if (*x2 != *x1) return false; break; case 2: if (*(short*)x2 != *(short*)x1) return false; break; case 1: if (*x2 != *x1) return false; break; } return true; } } [SecuritySafeCritical] public static unsafe bool Fill(this byte[] a1, byte b1) { if (a1 == null) return false; byte[] fbl = { b1, b1, b1, b1, b1, b1, b1, b1 }; byte[] fbi = { b1, b1, b1, b1 }; byte[] fbs = { b1, b1 }; byte[] fbb = { b1 }; fixed (byte* p1 = a1, p8 = fbl, p4 = fbi, p2 = fbs, p0 = fbb) { var Len = a1.Length; var x1 = p1; while (Len > 7) { *(long*)x1 = *(long*)p8; x1 += 8; Len -= 8; } switch (Len % 8) { case 0: break; case 7: *(int*)x1 = *(int*)p4; x1 += 4; *(short*)x1 = *(short*)p2; x1 += 2; *x1 = *p0; break; case 6: *(int*)x1 = *(int*)p4; x1 += 4; *(short*)x1 = *(short*)p2; break; case 5: *(int*)x1 = *(int*)p4; x1 += 4; *x1 = *p0; break; case 4: *(int*)x1 = *(int*)p4; break; case 3: *(short*)x1 = *(short*)p2; x1 += 2; *x1 = *p0; break; case 2: *(short*)x1 = *(short*)p2; break; case 1: *x1 = *p0; break; } return true; } } [SecuritySafeCritical] public static unsafe bool Fill(this int[] a1, int i1) { if (a1 == null) return false; int[] fbl = { i1, i1 }; int[] fbi = { i1 }; fixed (int* p1 = a1, p8 = fbl, p4 = fbi) { var Len = a1.Length; var x1 = p1; while (Len > 1) { *(long*)x1 = *(long*)p8; x1 += 2; Len -= 2; } if (Len == 1) *x1 = *p4; return true; } } [SecuritySafeCritical] public static unsafe bool Fill(this long[] a1, long i1) { if (a1 == null) return false; long[] fbi = { i1 }; fixed (long* p1 = a1, p = fbi) { var Len = a1.Length; var x1 = p1; while (Len > 1) { *x1 = *p; x1 += 1; Len -= 1; } return true; } } [SecuritySafeCritical] public static unsafe bool Fill(this ulong[] a1, ulong i1) { if (a1 == null) return false; ulong[] fbi = { i1 }; fixed (ulong* p1 = a1, p = fbi) { var Len = a1.Length; var x1 = p1; while (Len > 1) { *x1 = *p; x1 += 1; Len -= 1; } return true; } } }