/// <summary> /// Converte a Base32 string to byte array. /// </summary> /// <param name="base32"> /// Base32 formated string. /// </param> /// <param name="format"> /// Specify the Base32 encoding format. /// </param> /// <returns> /// byte array with value of Base32 encoding. /// </returns> public static byte[] Decode(string base32, Base32Format format = Base32Format.RFC4648) { if (base32.Length == 0) { return(new byte[0]); } var mapping = Base32Mapping.GetMapping(format); base32 = RemovePadding(base32, mapping.PaddingChar); byte[] result = new byte[base32.Length * 5 / 8]; int buffer = 0; int next = 0; int bitsLeft = 0; foreach (var c in base32.ToCharArray()) { if (!mapping.CharValues.ContainsKey(c)) { throw new Base32DecodingException($"Character was illigal: {c}"); } buffer <<= 5; buffer |= mapping.CharValues[c] & 31; bitsLeft += 5; if (bitsLeft >= 8) { result[next++] = (byte)(buffer >> (bitsLeft - 8)); bitsLeft -= 8; } } return(result); }
public static byte[] Decode(this Base32Mapping mapping, string data) { IMapping map = mappings[mapping]; int dataIndex = 0; int bufferIndex = 0; int buffer = 0; int mask = 0b11111111; if (map.Padding != null) { data = data.Replace(map.Padding, ""); } MemoryStream result = new MemoryStream(); while (dataIndex < data.Length) { for (int i = 0; i < 5 && dataIndex < data.Length; i++) { buffer = buffer << 5; buffer += map[data.Substring(dataIndex++, 1)]; bufferIndex += 5; } while (bufferIndex >= 8) { int offset = bufferIndex - 8; result.WriteByte((byte)((buffer & (mask << offset)) >> offset)); buffer = buffer & (~(mask << offset)); bufferIndex -= 8; } } return(result.ToArray()); }
public static string Encode(this Base32Mapping mapping, byte[] data) { IMapping map = mappings[mapping]; int dataIndex = 0; int bufferIndex = 0; int buffer = 0; int mask = 0b11111; string result = ""; while (dataIndex < data.Length) { for (int i = 0; i < 3 && dataIndex < data.Length; i++) { buffer = buffer << 8; buffer += data[dataIndex++]; bufferIndex += 8; } while (bufferIndex >= 5) { int offset = bufferIndex - 5; result += map[(buffer & (mask << offset)) >> offset]; buffer = buffer & (~(mask << offset)); bufferIndex -= 5; } } if (bufferIndex != 0) { int d = 5 - bufferIndex; result += map[(buffer << d) & mask]; } if (map.Padding != null) { while (result.Length % map.Quantum != 0) { result += map.Padding; } } return(result); }
public static byte[] Base32Decode(this string data, Base32Mapping mapping = Base32Mapping.NS6316) { return(mapping.Decode(data)); }
public static string Base32Encode(this byte[] data, Base32Mapping mapping = Base32Mapping.NS6316) { return(mapping.Encode(data)); }