我有一个base32字符串,我需要将其转换为字节数组。而且我在.NET框架中找不到转换方法时遇到麻烦。我可以找到base64的方法,但找不到base32的方法。
Convert.FromBase64String –对于base32这样的东西将是完美的。
Convert.FromBase64String
框架中是否有这样的方法,还是我必须自己滚动?
FromBase32String在此处找到.NET的此实现检查。
FromBase32String
编辑:上面的链接已死;您可以在archive.org上找到存档副本
实际代码如下:
using System; using System.Text; public sealed class Base32 { // the valid chars for the encoding private static string ValidChars = "QAZ2WSX3" + "EDC4RFV5" + "TGB6YHN7" + "UJM8K9LP"; /// <summary> /// Converts an array of bytes to a Base32-k string. /// </summary> public static string ToBase32String(byte[] bytes) { StringBuilder sb = new StringBuilder(); // holds the base32 chars byte index; int hi = 5; int currentByte = 0; while (currentByte < bytes.Length) { // do we need to use the next byte? if (hi > 8) { // get the last piece from the current byte, shift it to the right // and increment the byte counter index = (byte)(bytes[currentByte++] >> (hi - 5)); if (currentByte != bytes.Length) { // if we are not at the end, get the first piece from // the next byte, clear it and shift it to the left index = (byte)(((byte)(bytes[currentByte] << (16 - hi)) >> 3) | index); } hi -= 3; } else if(hi == 8) { index = (byte)(bytes[currentByte++] >> 3); hi -= 3; } else { // simply get the stuff from the current byte index = (byte)((byte)(bytes[currentByte] << (8 - hi)) >> 3); hi += 5; } sb.Append(ValidChars[index]); } return sb.ToString(); } /// <summary> /// Converts a Base32-k string into an array of bytes. /// </summary> /// <exception cref="System.ArgumentException"> /// Input string <paramref name="s">s</paramref> contains invalid Base32-k characters. /// </exception> public static byte[] FromBase32String(string str) { int numBytes = str.Length * 5 / 8; byte[] bytes = new Byte[numBytes]; // all UPPERCASE chars str = str.ToUpper(); int bit_buffer; int currentCharIndex; int bits_in_buffer; if (str.Length < 3) { bytes[0] = (byte)(ValidChars.IndexOf(str[0]) | ValidChars.IndexOf(str[1]) << 5); return bytes; } bit_buffer = (ValidChars.IndexOf(str[0]) | ValidChars.IndexOf(str[1]) << 5); bits_in_buffer = 10; currentCharIndex = 2; for (int i = 0; i < bytes.Length; i++) { bytes[i] = (byte)bit_buffer; bit_buffer >>= 8; bits_in_buffer -= 8; while (bits_in_buffer < 8 && currentCharIndex < str.Length) { bit_buffer |= ValidChars.IndexOf(str[currentCharIndex++]) << bits_in_buffer; bits_in_buffer += 5; } } return bytes; } }