目的:将一串字符转换为数字,并且可以将数字再转换回原字符串。
比如:将“afdf afa,faf 123456"转为数字num,同时可以实现将NUM转换为“afdf afa,faf 123456"
我觉得得用一个可逆的加密算法。不过以前没什么接触。请大家给个提示。
比如:将“afdf afa,faf 123456"转为数字num,同时可以实现将NUM转换为“afdf afa,faf 123456"
我觉得得用一个可逆的加密算法。不过以前没什么接触。请大家给个提示。
int[] unicode = new int[str.Length];
for(int i=0;i<str.Length;i++)
{
unicode[i] = (int)str[i];
}我以前是对unicode每一位加上不同的值。比如unicode[0]加1,unicode[1]加2。诸如此类
这样加密和解密都很容易。lz可以考虑更复杂的算法
也能转换。
如果是全部字符,用Unicode编码,字符集就大的多了
如果可以限定字符的范围,可以用一个自定义编码,给每个字符编号
只需一一对应即可
每一个都转换成ASC码那就是40个数字+。而这些数字是要存入数据库的。我得意思就是,有没有办法可以把生成的数字缩短长度。
=================
数字是不存入数据库的。
加密过程:“a”(原始字符串)→ 97(unicode)→“b”加密后的字符→把“b”存入数据库
加密后的字符串长度和原字符串相同
加密过程:“a”(原始字符串)→ 97(unicode)→97+1(加密过程)→“b”98所对应的字符→把“b”存入数据库
你想把任意一个字符串转换成一个数字,再由这个数字还原成字符串?
如果可以这样,那么多人研究压缩算法干什么?硬盘做的那么大来干什么,够装几个数字就可以了嘛!
我不知道你是没有明白我的意思还是你更本就没看上面大家的回复。
To everyone
我愿来得想法是生成数字以后看位数多少,让后减去一个固定的数字。实现长度缩小。不过这样需要作很多的判断。不如首先我得判断位数,还得判断各位的大小。最后还得作出一个统一的转换规则。这样我觉得太原始。不知道大家有没有什么思路提示我一下。
using System.Collections.Generic;
using System.Text;namespace zDit.Chinese
{
/// <summary>
/// 字符串转换为byte数组的方法
/// </summary>
/// <param name="str">原字符串</param>
/// <returns>编码结果</returns>
public delegate byte[] str2bin(string str);
/// <summary>
/// byte数组转换为字符串的委托
/// </summary>
/// <param name="bin">原byte数组</param>
/// <returns>解码结果</returns>
public delegate string bin2str(byte[] bin); /// <summary>
/// 数据的编码与解码
/// </summary>
public static class Code
{
#region 加码
/// <summary>
/// 对字符串加码
/// </summary>
/// <param name="str">原字符串</param>
/// <param name="getBytes">加码方法</param>
/// <returns>加码结果</returns>
public static string StrToBin(string str, str2bin getBytes)
{
str = str.Replace("\u0000", "");
byte[] charBin = getBytes(str);
string result = "";
foreach (byte hexNum in charBin)
{
result += hexNum.ToString("X2");
}
return result;
} /// <summary>
/// 对字符串加码(使用Encoding.Default.GetBytes方法)
/// </summary>
/// <param name="str">原字符串</param>
/// <returns>加码结果</returns>
public static string StrToBin(string str)
{
return StrToBin(str, Encoding.Default.GetBytes);
}
#endregion #region 解码 /// <summary>
/// 对字符串解码
/// </summary>
/// <param name="str">经过编码的字符串</param>
/// <param name="getString">解码方法</param>
/// <returns>解码结果</returns>
public static string BinToStr(string str, bin2str getString)
{
byte[] charBin = new byte[str.Length >> 1];
for (int index = 0; index < charBin.Length; index++)
{
charBin[index] = byte.Parse(str.Substring(index << 1, 2), System.Globalization.NumberStyles.HexNumber);
}
return getString(charBin);
} /// <summary>
/// 对字符串解码
/// </summary>
/// <param name="str">要解码的字符串</param>
/// <returns>解码结果</returns>
public static string BinToStr(string str)
{
return BinToStr(str, Encoding.Default.GetString);
}
#endregion
}
}
多谢
不过可不可以写详细一点
比如
函数public delegate byte[] str2bin(string str);
以及
byte[] charBin = getBytes(str);
getBytes这个方法怎么实现的?
每一个都转换成ASC码那就是40个数字+。而这些数字是要存入数据库的。我得意思就是,有没有办法可以把生成的数字缩短长度。
===============================================================
输入的字符有限制么?
比如说,字符串只能是字母或者数字组成
----------------------------------------------
首先 public delegate byte[] str2bin(string str);不是函数.
而是定义的委托..byte[] charBin = getBytes(str);中.
getBytes是传入的方法....
可以是任何带一个string的参数,返回类型为byte[]的方法.
比如
Encoding.Default.GetBytes 就是符合条件的一个方法.要怎么实现这个方法.也完全可以由你自己写...
很简单的.看一下委托就明白了..
嗯实际上我说的不是一个字符的转换,而是一个字符串。而这个字符串的长度在20个字符左右。
每一个都转换成ASC码那就是40个数字+。而这些数字是要存入数据库的。我得意思就是,有没有办法可以把生成的数字缩短长度。
______________________________不太现实,除非允许输入的字符有限,那么你就可以用viena(维也纳nn)所说的方法,一一对应自己实现字符-->数字的转换.