public static TryResult <String> TryToBase32String(Value128 data, Base32Encoding base32Encoding) { if (base32Encoding == null) { return(encodeFailResult); } Char[] result; // Get padding symbol var paddingSymbol = base32Encoding.PaddingSymbol; if (paddingSymbol.HasValue) { result = new Char[32]; // Set padding result[26] = result[27] = result[28] = result[29] = result[30] = result[31] = paddingSymbol.Value; } else { result = new Char[26]; } var higherHalf = data.HigherHalf; var lowerHalf = data.LowerHalf; // Get alphabet var alphabet = base32Encoding.Alphabet; for (Int32 indexH = 0, indexL = 13, shiftH = 59, shiftL = 58; indexH < 12; indexH++, indexL++, shiftH -= 5, shiftL -= 5) { result[indexH] = alphabet[(Int32)(higherHalf >> shiftH) & 0x1F]; result[indexL] = alphabet[(Int32)(lowerHalf >> shiftL) & 0x1F]; } result[12] = alphabet[(Int32)(((higherHalf << 1) & 0x1E) | ((lowerHalf >> 63) & 0x01))]; result[25] = alphabet[(Int32)((lowerHalf << 2) & 0x1C)]; return(TryResult <String> .CreateSuccess(new String(result))); }
public void TestCtor() { try // null alphabet { var x = new Base32Encoding(null); Assert.Fail(typeof(ArgumentNullException).ToString()); } catch (ArgumentNullException) { } try // bad length alphabet { var x = new Base32Encoding("1245645"); Assert.Fail(typeof(ArgumentException).ToString()); } catch (ArgumentException) { } try // look-up table null { var x = new Base32Encoding(Base32Encoding.Hex.Alphabet, (Byte[])null); Assert.Fail(typeof(ArgumentNullException).ToString()); } catch (ArgumentNullException) { } try // look-up table bad length { var x = new Base32Encoding(Base32Encoding.Hex.Alphabet, new Byte[20]); Assert.Fail(typeof(ArgumentNullException).ToString()); } catch (ArgumentException) { } }
static Base32Encoding() { Crockford = new Base32Encoding(crockfordAlphabet, crockfordLookupTable); Hex = new Base32Encoding(hexAlphabet); }
public static TryResult <Value128> TryFromBase32String(String data, Int32 offset, Base32Encoding base32Encoding) { // Check input values if ((data == null) || (offset > data.Length - base32EncodedSymbolsCount) || (base32Encoding == null)) { return(convertFailResult); } // Get look-up table var lookupTable = base32Encoding.LookupTable; var lastIndex = offset + 12; var symbol12 = (UInt64)lookupTable[data[lastIndex] & 0x7F]; var symbol25 = (UInt64)lookupTable[data[offset + 25] & 0x7F]; // Check symbol if ((symbol12 | symbol25) == 0xFF) { return(convertFailResult); } // Calculate higher half var higherHalf = symbol12 >> 1; // Calculate lower half var lowerHalf = symbol12 << 63 | symbol25 >> 2; // Decode symbols for (Int32 indexH = offset, indexL = offset + 13, shiftH = 59, shiftL = 58; indexH < lastIndex; indexH++, indexL++, shiftH -= 5, shiftL -= 5) { // Get symbols var symbolH = data[indexH] & 0x7F; var symbolL = data[indexL] & 0x7F; // Get symbols values var symbolHValue = (UInt64)lookupTable[symbolH]; var symbolLValue = (UInt64)lookupTable[symbolL]; // Check symbol if ((symbolHValue | symbolLValue) == 0xFF) { return(convertFailResult); } higherHalf |= symbolHValue << shiftH; lowerHalf |= symbolLValue << shiftL; } // Initialize a new instance var result = new Value128(higherHalf, lowerHalf); return(TryResult <Value128> .CreateSuccess(result)); }