我有一个字节数组(任意长度),我想用我自己的基本编码器将这个数组编码成字符串.In .NET是标准Base64编码器,但如果我想对数组进行编码Base62,Base53或者Base13?
甚至可以创建这样的通用基础编码器?
我知道我可以用简单的方法做到这一点,也就是说,对于每个字节保留固定数量的字符(如果是Base62,那将是5个字符),并做直接字节 - >字符编码,但我会浪费空间,因为5个Base62字符可以包含多于1个字节,但少于2个字节.
我应该怎么写这样的编码器?或者已经有一些课程了吗?
请注意我也需要通用解码器,否则这对我来说没用.
由于该解决方案已经知道(使用BigInteger),我只想在这里提供一些与BigInteger该类相关的资源,因为它在.NET 3.5中不可用:
C#中的大整数
http://intx.codeplex.com/
https://svn.apache.org/repos/asf/incubator/heraldry/libraries/csharp/openid/trunk/Mono/Mono.Math/BigInteger.cs
http ://www.codeproject.com/KB/cs/BigInteger_Library.aspx
http://www.codeproject.com/KB/cs/biginteger.aspx
我目前正在创建一个随机密码是这样的:
public static int getRandomNumber(int maxNumber)
{
if (maxNumber < 1)
throw new System.Exception("The maxNumber value should be greater than 1");
byte[] b = new byte[4];
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
int seed = (b[0] & 0x7f) << 24 | b[1] << 16 | b[2] << 8 | b[3];
System.Random r = new System.Random(seed);
return r.Next(1, maxNumber);
}
Run Code Online (Sandbox Code Playgroud)
一些可能的问题?这是一个静态函数,有一些奇怪的种子模式可能不安全,仍然使用System.Random().
使用上面的随机数生成器,我以这种低效的方式创建一个字符串:
validCharacters = "abcdefghjkmnoxyz023456789#!@";
Run Code Online (Sandbox Code Playgroud)
然后使用有效数组循环并获取"createPassword(length)"类型字符串(注意使用不包含容错字符的字符集,如1 i等).
这是如何做到的,还是有更简单,更安全,更有效的方式?
我有一个使用哈希函数创建的字节数组.我想将此数组转换为字符串.到目前为止这么好,它会给我十六进制字符串.
现在我想使用不同于十六进制字符的东西,我想用这36个字符编码字节数组:[az] [0-9].
我该怎么办?
编辑:我之所以这样做,是因为我希望有一个比十六进制字符串更小的字符串.