C#中byte[]与string相互转换及string与sql server中nvarchar的转换问题
最近在写专业实践-数据库加密,找出以前写的MD5、DES程序,编成两个动态链接库MD5.dll、DES.dll,在这把我遇到的问题分享下~
(1)byte[]与string的相互转换
首先在C#中string是Unicode编码,byte是8位无符号整数,而char是16位的,如何将string转换成byte[],将其作为参数 调用dll计算md5值或是DES加密?获得加密结果(byte[]类型)后,将其转换成string类型存入数据库(sql server 2000)中,同时又能从数据库中读出并转换成原来的byte[]呢?
public byte[] ascstringtobytearray(string s)
{
byte[] b = (new ASCIIEncoding()).GetBytes(s);
return b;
}
{
byte[] b = (new ASCIIEncoding()).GetBytes(s);
return b;
}
public string ascbytearraytostring(byte[] b)
{
string s = (new ASCIIEncoding()).GetString(b, 0, b.Length);
return s;
}
{
string s = (new ASCIIEncoding()).GetString(b, 0, b.Length);
return s;
}
public byte[] unistringtobytearray(string s)
{
byte[] b = (new UnicodeEncoding()).GetBytes(s);
return b;
}
{
byte[] b = (new UnicodeEncoding()).GetBytes(s);
return b;
}
public string unibytearraytostring(byte[] b)
{
string s = (new UnicodeEncoding()).GetString(b, 0, b.Length);
return s;
}
{
string s = (new UnicodeEncoding()).GetString(b, 0, b.Length);
return s;
}
看了这个就知道了,byte[]转string有两种编码方式:ASCII和Unicode,其中在ASCII编码下,string的每个字符都转换其相 应的ASCII值,对应一个byte,而在Unicode编码下,string的每个字符要转换成两个byte,因此
如果在ASCII编码下byte[](byte大小为0-255)转换成string时可能会发生溢出。
当你需要长度为8的string转换成byte[8]时,例如调用dll时函数参数为byte[8],这个时候就可以用ascstringtobytearray(),同时在解密后,要将byte[8]转换成8位的string,
这时可以确认byte[8]中的byte的值都在(0,127)内,
因此可以放心地用ascbytearraytostring()转换而不会发生溢出。
但是当加密后的结果需要以string形式存入sql server时,加密结果的byte[16]就需要用unibytearraytostring()转换成长度为8的string,同时长度为8的 string用unistringtobytearray()可以转换成原来的byte[16],
因为如果用ASCII编码,可以肯定转换不回去。
(2)string与sql server中的nvarchar存取的乱码问题
问题又来了,当string存入sql server 2000是,虽然相应的字段设成
nvarchar类型,
可是打开数据库一看却有乱码和问号 ,读出数据来看,还是乱码和问号。原来 Unicode的string在存入数据库时需要用到关键字
N,
例如:
string sql = String.Format("insert into [User] values('" + username + "',N'"+password + "')");
呵呵,这下总算没问题了吧!下篇写写数据库加密的实现,先完善我的程序吧!