Skip to content

Instantly share code, notes, and snippets.

@BenjaminHolland
Created March 7, 2018 20:13
Show Gist options
  • Save BenjaminHolland/49cf8755295d1cccfe0afa84b81e9d43 to your computer and use it in GitHub Desktop.
Save BenjaminHolland/49cf8755295d1cccfe0afa84b81e9d43 to your computer and use it in GitHub Desktop.
public static class NumericConverter
{
public enum PadMode
{
Zeros,
Ones,
Sign
}
private const int positiveExt = 0x00;
private const int negativeExt = 0xFF;
private const byte signMask = 0x80;
public static int ToInt32(ReadOnlySpan<byte> src, PadMode padMode, ByteOrder srcOrder)
{
int msb = srcOrder == ByteOrder.BigEndian ? 0 : src.Length - 1;
int pad = 0;
switch (padMode)
{
case PadMode.Ones: pad = negativeExt; break;
case PadMode.Zeros: pad = positiveExt; break;
case PadMode.Sign: pad = (src[msb] & signMask) != 0 ? negativeExt : positiveExt; break;
}
switch (src)
{
case var x when x.Length == 1:
return pad << 24 | pad << 16 | pad << 8 | src[0];
case var x when x.Length == 2 && srcOrder == ByteOrder.BigEndian:
return pad << 24 | pad << 16 | src[0] << 8 | src[1];
case var x when x.Length == 2 && srcOrder == ByteOrder.LittleEndian:
return pad << 24 | pad << 16 | src[1] << 8 | src[0];
case var x when x.Length == 3 && srcOrder == ByteOrder.BigEndian:
return pad << 24 | src[0] << 16 | src[1] << 8 | src[2];
case var x when x.Length == 3 && srcOrder == ByteOrder.LittleEndian:
return pad << 24 | src[2] << 16 | src[1] << 8 | src[0];
case var x when x.Length == 4 && srcOrder == ByteOrder.BigEndian:
return src[0] << 24 | src[1] << 16 | src[2] << 8 | src[3];
case var x when x.Length == 4 && srcOrder == ByteOrder.LittleEndian:
return src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0];
default: throw new NotSupportedException();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment