Skip to content

Instantly share code, notes, and snippets.

@jandk
Last active December 31, 2015 00:39
Show Gist options
  • Save jandk/7908352 to your computer and use it in GitHub Desktop.
Save jandk/7908352 to your computer and use it in GitHub Desktop.
Remove unneeded brackets and casts
using System;
class ConvertBytes
{
public static void Convert08to08(byte[] src, int srcOff, short[] dst, int dstOff, int dstLen)
{
ValidateRange(src, srcOff, dst, dstOff, dstLen, 8);
int n = dstLen / 4;
for (int i = 0; i < n; i++)
{
dst[dstOff++] = src[srcOff++];
dst[dstOff++] = src[srcOff++];
dst[dstOff++] = src[srcOff++];
dst[dstOff++] = src[srcOff++];
}
}
public static void Convert08to08(short[] src, int srcOff, byte[] dst, int dstOff, int srcLen)
{
ValidateRange(src, srcOff, dst, dstOff, srcLen, 8);
int n = srcLen / 4;
for (int i = 0; i < n; i++)
{
dst[dstOff++] = (byte)src[srcOff++];
dst[dstOff++] = (byte)src[srcOff++];
dst[dstOff++] = (byte)src[srcOff++];
dst[dstOff++] = (byte)src[srcOff++];
}
}
public static void Convert08to10(byte[] src, int srcOff, short[] dst, int dstOff, int dstLen)
{
ValidateRange(src, srcOff, dst, dstOff, dstLen, 10);
int n = dstLen / 4;
for (int i = 0; i < n; i++)
{
byte b0 = src[srcOff++];
byte b1 = src[srcOff++];
byte b2 = src[srcOff++];
byte b3 = src[srcOff++];
byte b4 = src[srcOff++];
dst[dstOff++] = (short)(b0 << 2 | (b1 & 0xc0) >> 6);
dst[dstOff++] = (short)((b1 & 0x3f) << 4 | (b2 & 0xf0) >> 4);
dst[dstOff++] = (short)((b2 & 0x0f) << 6 | (b3 & 0xfc) >> 2);
dst[dstOff++] = (short)((b3 & 0x03) << 8 | b4);
}
}
public static void Convert08to12(byte[] src, int srcOff, short[] dst, int dstOff, int dstLen)
{
ValidateRange(src, srcOff, dst, dstOff, dstLen, 12);
int n = dstLen / 4;
for (int i = 0; i < n; i++)
{
byte b0 = src[srcOff++];
byte b1 = src[srcOff++];
byte b2 = src[srcOff++];
byte b3 = src[srcOff++];
byte b4 = src[srcOff++];
byte b5 = src[srcOff++];
dst[dstOff++] = (short)(b0 << 4 | (b1 & 0xf0) >> 4);
dst[dstOff++] = (short)((b1 & 0x0f) << 8 | b2);
dst[dstOff++] = (short)(b3 << 4 | (b4 & 0xf0) >> 4);
dst[dstOff++] = (short)((b4 & 0x0f) << 8 | b5);
}
}
public static void Convert08to14(byte[] src, int srcOff, short[] dst, int dstOff, int dstLen)
{
ValidateRange(src, srcOff, dst, dstOff, dstLen, 14);
int n = dstLen / 4;
for (int i = 0; i < n; i++)
{
byte b0 = src[srcOff++];
byte b1 = src[srcOff++];
byte b2 = src[srcOff++];
byte b3 = src[srcOff++];
byte b4 = src[srcOff++];
byte b5 = src[srcOff++];
byte b6 = src[srcOff++];
dst[dstOff++] = (short)(b0 << 6 | (b1 & 0xfc) >> 2);
dst[dstOff++] = (short)((b1 & 0x03) << 12 | b2 << 4 | (b3 & 0xf0) >> 4);
dst[dstOff++] = (short)((b3 & 0x0f) << 10 | b4 << 2 | (b5 & 0xc0) >> 6);
dst[dstOff++] = (short)((b5 & 0x3f) << 8 | b6);
}
}
public static void Convert08to16(byte[] src, int srcOff, short[] dst, int dstOff, int dstLen)
{
ValidateRange(src, srcOff, dst, dstOff, dstLen, 16);
int n = dstLen / 4;
for (int i = 0; i < n; i++)
{
dst[dstOff++] = (short)(src[srcOff++] << 8 | src[srcOff++]);
dst[dstOff++] = (short)(src[srcOff++] << 8 | src[srcOff++]);
dst[dstOff++] = (short)(src[srcOff++] << 8 | src[srcOff++]);
dst[dstOff++] = (short)(src[srcOff++] << 8 | src[srcOff++]);
}
}
public static void Convert10to08(short[] src, int srcOff, byte[] dst, int dstOff, int srcLen)
{
ValidateRange(src, srcOff, dst, dstOff, srcLen, 10);
int n = srcLen / 4;
for (int i = 0; i < n; i++)
{
short s0 = src[srcOff++];
short s1 = src[srcOff++];
short s2 = src[srcOff++];
short s3 = src[srcOff++];
dst[dstOff++] = (byte)((s0 & 0x3fc) >> 2);
dst[dstOff++] = (byte)((s0 & 0x003) << 6 | (s1 & 0x3f0) >> 4);
dst[dstOff++] = (byte)((s1 & 0x00f) << 4 | (s2 & 0x3c0) >> 6);
dst[dstOff++] = (byte)((s2 & 0x03f) << 2 | (s3 & 0x300) >> 8);
dst[dstOff++] = (byte)s3;
}
}
public static void Convert12to08(short[] src, int srcOff, byte[] dst, int dstOff, int srcLen)
{
ValidateRange(src, srcOff, dst, dstOff, srcLen, 12);
int n = srcLen / 4;
for (int i = 0; i < n; i++)
{
short s0 = src[srcOff++];
short s1 = src[srcOff++];
short s2 = src[srcOff++];
short s3 = src[srcOff++];
dst[dstOff++] = (byte)((s0 & 0xff0) >> 4);
dst[dstOff++] = (byte)((s0 & 0x00f) << 4 | (s1 & 0xf00) >> 8);
dst[dstOff++] = (byte)s1;
dst[dstOff++] = (byte)((s2 & 0xff0) >> 4);
dst[dstOff++] = (byte)((s2 & 0x00f) << 4 | (s3 & 0xf00) >> 8);
dst[dstOff++] = (byte)s3;
}
}
public static void Convert14to08(short[] src, int srcOff, byte[] dst, int dstOff, int srcLen)
{
ValidateRange(src, srcOff, dst, dstOff, srcLen, 14);
int n = srcLen / 4;
for (int i = 0; i < n; i++)
{
short s0 = src[srcOff++];
short s1 = src[srcOff++];
short s2 = src[srcOff++];
short s3 = src[srcOff++];
dst[dstOff++] = (byte)((s0 & 0x3fc0) >> 6);
dst[dstOff++] = (byte)((s0 & 0x003f) << 2 | (s1 & 0x3000) >> 12);
dst[dstOff++] = (byte)((s1 & 0x0ff0) >> 4);
dst[dstOff++] = (byte)((s1 & 0x000f) << 4 | (s2 & 0x3c00) >> 10);
dst[dstOff++] = (byte)((s2 & 0x03fc) >> 2);
dst[dstOff++] = (byte)((s2 & 0x0003) << 6 | (s3 & 0x3f00) >> 8);
dst[dstOff++] = (byte)s3;
}
}
public static void Convert16to08(short[] src, int srcOff, byte[] dst, int dstOff, int srcLen)
{
ValidateRange(src, srcOff, dst, dstOff, srcLen, 16);
int n = srcLen / 4;
for (int i = 0; i < n; i++)
{
short s0 = src[srcOff++];
short s1 = src[srcOff++];
short s2 = src[srcOff++];
short s3 = src[srcOff++];
dst[dstOff++] = (byte)((s0 & 0xff00) >> 8);
dst[dstOff++] = (byte)s0;
dst[dstOff++] = (byte)((s1 & 0xff00) >> 8);
dst[dstOff++] = (byte)s1;
dst[dstOff++] = (byte)((s2 & 0xff00) >> 8);
dst[dstOff++] = (byte)s2;
dst[dstOff++] = (byte)((s3 & 0xff00) >> 8);
dst[dstOff++] = (byte)s3;
}
}
private static void ValidateRange(byte[] src, int srcOff, short[] dst, int dstOff, int len, int dstBits)
{
if (src == null || dst == null)
throw new ArgumentException("src or dst is null");
ValidateRange(src.Length, srcOff, dst.Length, dstOff, len, 8, dstBits);
}
private static void ValidateRange(int srcLen, int srcOff, int dstLen, int dstOff, int len, int srcBits, int dstBits)
{
int srcNeed = (srcBits == 8) ? ((len + dstBits - 1) / 8) : len;
int dstNeed = (dstBits == 8) ? ((len + srcBits - 1) / 8) : len;
if (srcOff + srcNeed > srcLen)
throw new ArgumentException("src too short");
if (dstOff + dstNeed > dstLen)
throw new ArgumentException("dst too short");
if (len % 4 != 0)
throw new ArgumentException("short[] len should be a multiple of 4");
}
private static void ValidateRange(short[] src, int srcOff, byte[] dst, int dstOff, int len, int srcBits)
{
if (src == null || dst == null)
throw new ArgumentException("src or dst is null");
ValidateRange(src.Length, srcOff, dst.Length, dstOff, len, srcBits, 8);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment