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; } } }