public static void Main()
var betIds = new string[]
"AIBQAAQAVLL5MIQAAAAABCIOAAAA",
"AIBQACAADB3ROIYAAAAAANYBAAAA",
"AIBQAAQAYCLWOGYAAAAAAUQYAAAA",
foreach (var betId in betIds)
var bytes = Base32.ToBytes(betId);
bytes = bytes.Skip(13).Take(4).ToArray();
var i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine($"betId: {betId}, TransNum: {i}");
public static byte[] ToBytes(string input)
if (string.IsNullOrEmpty(input))
throw new ArgumentNullException("input");
input = input.TrimEnd('=');
int byteCount = input.Length * 5 / 8;
byte[] returnArray = new byte[byteCount];
byte curByte = 0, bitsRemaining = 8;
int mask = 0, arrayIndex = 0;
foreach (char c in input)
int cValue = CharToValue(c);
mask = cValue << (bitsRemaining - 5);
curByte = (byte) (curByte | mask);
mask = cValue >> (5 - bitsRemaining);
curByte = (byte) (curByte | mask);
returnArray[arrayIndex++] = curByte;
curByte = (byte) (cValue << (3 + bitsRemaining));
if (arrayIndex != byteCount)
returnArray[arrayIndex] = curByte;
public static string ToString(byte[] input)
if (input == null || input.Length == 0)
throw new ArgumentNullException("input");
int charCount = (int) Math.Ceiling(input.Length / 5d) * 8;
char[] returnArray = new char[charCount];
byte nextChar = 0, bitsRemaining = 5;
foreach (byte b in input)
nextChar = (byte) (nextChar | (b >> (8 - bitsRemaining)));
returnArray[arrayIndex++] = ValueToChar(nextChar);
nextChar = (byte) ((b >> (3 - bitsRemaining)) & 31);
returnArray[arrayIndex++] = ValueToChar(nextChar);
nextChar = (byte) ((b << bitsRemaining) & 31);
if (arrayIndex != charCount)
returnArray[arrayIndex++] = ValueToChar(nextChar);
while (arrayIndex != charCount) returnArray[arrayIndex++] = '=';
return new string(returnArray);
private static int CharToValue(char c)
if (value < 91 && value > 64)
if (value < 56 && value > 49)
if (value < 123 && value > 96)
throw new ArgumentException("Character is not a Base32 character.", "c");
private static char ValueToChar(byte b)
throw new ArgumentException("Byte is not a value Base32 value.", "b");