Skip to content

Instantly share code, notes, and snippets.

@neuecc
Last active August 1, 2017 15:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save neuecc/9ef84471f7a62e849cb99c87d62484f0 to your computer and use it in GitHub Desktop.
Save neuecc/9ef84471f7a62e849cb99c87d62484f0 to your computer and use it in GitHub Desktop.
NumberConverter
using System;
namespace MyNamespace
{
/// <summary>
/// UTF8(Ascii) ByteArray to Number Converter to avoid utf8 convert and number parsing.
/// </summary>
public static class NumberConverter
{
// loop unrolling(we know number length)
const byte Minus = 45;
const byte Zero = 48;
public static Int32 ToInt32(byte[] bytes, int offset, int count)
{
// Min: -2147483648
// Max: 2147483647
// Digits: 10
if (bytes[offset] != Minus)
{
switch (count)
{
case 1:
return ((bytes[offset] - Zero));
case 2:
return ((bytes[offset] - Zero) * 10) + ((bytes[offset + 1] - Zero));
case 3:
return ((bytes[offset] - Zero) * 100) + ((bytes[offset + 1] - Zero) * 10) + ((bytes[offset + 2] - Zero));
case 4:
return ((bytes[offset] - Zero) * 1000) + ((bytes[offset + 1] - Zero) * 100) + ((bytes[offset + 2] - Zero) * 10) + ((bytes[offset + 3] - Zero));
case 5:
return ((bytes[offset] - Zero) * 10000) + ((bytes[offset + 1] - Zero) * 1000) + ((bytes[offset + 2] - Zero) * 100) + ((bytes[offset + 3] - Zero) * 10) + ((bytes[offset + 4] - Zero));
case 6:
return ((bytes[offset] - Zero) * 100000) + ((bytes[offset + 1] - Zero) * 10000) + ((bytes[offset + 2] - Zero) * 1000) + ((bytes[offset + 3] - Zero) * 100) + ((bytes[offset + 4] - Zero) * 10) + ((bytes[offset + 5] - Zero));
case 7:
return ((bytes[offset] - Zero) * 1000000) + ((bytes[offset + 1] - Zero) * 100000) + ((bytes[offset + 2] - Zero) * 10000) + ((bytes[offset + 3] - Zero) * 1000) + ((bytes[offset + 4] - Zero) * 100) + ((bytes[offset + 5] - Zero) * 10) + ((bytes[offset + 6] - Zero));
case 8:
return ((bytes[offset] - Zero) * 10000000) + ((bytes[offset + 1] - Zero) * 1000000) + ((bytes[offset + 2] - Zero) * 100000) + ((bytes[offset + 3] - Zero) * 10000) + ((bytes[offset + 4] - Zero) * 1000) + ((bytes[offset + 5] - Zero) * 100) + ((bytes[offset + 6] - Zero) * 10) + ((bytes[offset + 7] - Zero));
case 9:
return ((bytes[offset] - Zero) * 100000000) + ((bytes[offset + 1] - Zero) * 10000000) + ((bytes[offset + 2] - Zero) * 1000000) + ((bytes[offset + 3] - Zero) * 100000) + ((bytes[offset + 4] - Zero) * 10000) + ((bytes[offset + 5] - Zero) * 1000) + ((bytes[offset + 6] - Zero) * 100) + ((bytes[offset + 7] - Zero) * 10) + ((bytes[offset + 8] - Zero));
case 10:
return ((bytes[offset] - Zero) * 1000000000) + ((bytes[offset + 1] - Zero) * 100000000) + ((bytes[offset + 2] - Zero) * 10000000) + ((bytes[offset + 3] - Zero) * 1000000) + ((bytes[offset + 4] - Zero) * 100000) + ((bytes[offset + 5] - Zero) * 10000) + ((bytes[offset + 6] - Zero) * 1000) + ((bytes[offset + 7] - Zero) * 100) + ((bytes[offset + 8] - Zero) * 10) + ((bytes[offset + 9] - Zero));
default:
throw new ArgumentException("Integer out of range");
}
}
else
{
switch (count)
{
case 2:
return (((bytes[offset + 1] - Zero))) * -1;
case 3:
return (((bytes[offset + 1] - Zero) * 10) + ((bytes[offset + 2] - Zero))) * -1;
case 4:
return (((bytes[offset + 1] - Zero) * 100) + ((bytes[offset + 2] - Zero) * 10) + ((bytes[offset + 3] - Zero))) * -1;
case 5:
return (((bytes[offset + 1] - Zero) * 1000) + ((bytes[offset + 2] - Zero) * 100) + ((bytes[offset + 3] - Zero) * 10) + ((bytes[offset + 4] - Zero))) * -1;
case 6:
return (((bytes[offset + 1] - Zero) * 10000) + ((bytes[offset + 2] - Zero) * 1000) + ((bytes[offset + 3] - Zero) * 100) + ((bytes[offset + 4] - Zero) * 10) + ((bytes[offset + 5] - Zero))) * -1;
case 7:
return (((bytes[offset + 1] - Zero) * 100000) + ((bytes[offset + 2] - Zero) * 10000) + ((bytes[offset + 3] - Zero) * 1000) + ((bytes[offset + 4] - Zero) * 100) + ((bytes[offset + 5] - Zero) * 10) + ((bytes[offset + 6] - Zero))) * -1;
case 8:
return (((bytes[offset + 1] - Zero) * 1000000) + ((bytes[offset + 2] - Zero) * 100000) + ((bytes[offset + 3] - Zero) * 10000) + ((bytes[offset + 4] - Zero) * 1000) + ((bytes[offset + 5] - Zero) * 100) + ((bytes[offset + 6] - Zero) * 10) + ((bytes[offset + 7] - Zero))) * -1;
case 9:
return (((bytes[offset + 1] - Zero) * 10000000) + ((bytes[offset + 2] - Zero) * 1000000) + ((bytes[offset + 3] - Zero) * 100000) + ((bytes[offset + 4] - Zero) * 10000) + ((bytes[offset + 5] - Zero) * 1000) + ((bytes[offset + 6] - Zero) * 100) + ((bytes[offset + 7] - Zero) * 10) + ((bytes[offset + 8] - Zero))) * -1;
case 10:
return (((bytes[offset + 1] - Zero) * 100000000) + ((bytes[offset + 2] - Zero) * 10000000) + ((bytes[offset + 3] - Zero) * 1000000) + ((bytes[offset + 4] - Zero) * 100000) + ((bytes[offset + 5] - Zero) * 10000) + ((bytes[offset + 6] - Zero) * 1000) + ((bytes[offset + 7] - Zero) * 100) + ((bytes[offset + 8] - Zero) * 10) + ((bytes[offset + 9] - Zero))) * -1;
case 11:
return (((bytes[offset + 1] - Zero) * 1000000000) + ((bytes[offset + 2] - Zero) * 100000000) + ((bytes[offset + 3] - Zero) * 10000000) + ((bytes[offset + 4] - Zero) * 1000000) + ((bytes[offset + 5] - Zero) * 100000) + ((bytes[offset + 6] - Zero) * 10000) + ((bytes[offset + 7] - Zero) * 1000) + ((bytes[offset + 8] - Zero) * 100) + ((bytes[offset + 9] - Zero) * 10) + ((bytes[offset + 10] - Zero))) * -1;
default:
throw new ArgumentException("Integer out of range");
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment