public static Subchannel DeinterleaveSubchannel(byte[] subchannel) { Subchannel sub = new Subchannel(); for (int i = 0; i < 12; i++) { for (int j = 0; j < 8; j++) { sub.p[i] += ShiftRight((byte)(subchannel[j + i * 8] & 0x80), j); sub.q[i] += ShiftRight((byte)(subchannel[j + i * 8] & 0x40), j-1); sub.r[i] += ShiftRight((byte)(subchannel[j + i * 8] & 0x20), j-2); sub.s[i] += ShiftRight((byte)(subchannel[j + i * 8] & 0x10), j-3); sub.t[i] += ShiftRight((byte)(subchannel[j + i * 8] & 0x8), j-4); sub.u[i] += ShiftRight((byte)(subchannel[j + i * 8] & 0x4), j-5); sub.v[i] += ShiftRight((byte)(subchannel[j + i * 8] & 0x2), j-6); sub.w[i] += ShiftRight((byte)(subchannel[j + i * 8] & 0x1), j-7); } } return sub; }
public static Subchannel UnpackSubchannel(byte[] subchannel) { Subchannel sub = new Subchannel(); Array.Copy(subchannel, 0, sub.p, 0, 12); Array.Copy(subchannel, 12, sub.q, 0, 12); Array.Copy(subchannel, 24, sub.r, 0, 12); Array.Copy(subchannel, 36, sub.s, 0, 12); Array.Copy(subchannel, 48, sub.t, 0, 12); Array.Copy(subchannel, 60, sub.u, 0, 12); Array.Copy(subchannel, 72, sub.v, 0, 12); Array.Copy(subchannel, 84, sub.w, 0, 12); return sub; }
public static byte[] InterleaveSubchannel(Subchannel sub) { byte[] subchannel = new byte[96]; for (int i = 0; i < 12; i++) { for (int j = 0; j < 8; j++) { subchannel[j + i * 8] += ShiftLeft((byte)(sub.p[i] & (0x80 >> j)), j); subchannel[j + i * 8] += ShiftLeft((byte)(sub.q[i] & (0x80 >> j)), j-1); subchannel[j + i * 8] += ShiftLeft((byte)(sub.r[i] & (0x80 >> j)), j-2); subchannel[j + i * 8] += ShiftLeft((byte)(sub.s[i] & (0x80 >> j)), j-3); subchannel[j + i * 8] += ShiftLeft((byte)(sub.t[i] & (0x80 >> j)), j-4); subchannel[j + i * 8] += ShiftLeft((byte)(sub.u[i] & (0x80 >> j)), j-5); subchannel[j + i * 8] += ShiftLeft((byte)(sub.v[i] & (0x80 >> j)), j-6); subchannel[j + i * 8] += ShiftLeft((byte)(sub.w[i] & (0x80 >> j)), j-7); } } return subchannel; }