MD5 16位,32位加密算法

代码如下:

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace MYMD5
    {
     public class MD5
     {
     const int BITS_TO_A_BYTE = 8;
     const int BYTES_TO_A_WORD = 4;
     const int BITS_TO_A_WORD = 32;
     private static long[] m_lOnBits = new long[30 + 1];
     private static long[] m_l2Power = new long[30 + 1];

     private static long LShift(long lValue, long iShiftBits)
     {
     long LShift = 0;
     if (iShiftBits == 0)
     {
     LShift = lValue;
     return LShift;
     }
     else
     {
     if (iShiftBits == 31)
     {
     if (Convert.ToBoolean(lValue & 1))
     {
     LShift = 0x80000000;
     }
     else
     {
     LShift = 0;
     }
     return LShift;
     }
     else
     {
     if (iShiftBits 31)
     {
     // Err.Raise 6;
     }
     }
     }

     if (Convert.ToBoolean((lValue & m_l2Power[31 – iShiftBits])))
     {
     LShift = ((lValue & m_lOnBits[31 – (iShiftBits + 1)]) * m_l2Power[iShiftBits]) | 0x80000000;
     }
     else
     {
     LShift = ((lValue & m_lOnBits[31 – iShiftBits]) * m_l2Power[iShiftBits]);
     }

     return LShift;
     }

     private static long RShift(long lValue, long iShiftBits)
     {
     long RShift = 0;
     if (iShiftBits == 0)
     {
     RShift = lValue;
     return RShift;
     }
     else
     {
     if (iShiftBits == 31)
     {
     if (Convert.ToBoolean(lValue & 0x80000000))
     {
     RShift = 1;
     }
     else
     {
     RShift = 0;
     }
     return RShift;
     }
     else
     {
     if (iShiftBits 31)
     {
     // Err.Raise 6;
     }
     }
     }

     RShift = (lValue & 0x7FFFFFFE) / m_l2Power[iShiftBits];

     if (Convert.ToBoolean((lValue & 0x80000000)))
     {
     RShift = (RShift | (0x40000000 / m_l2Power[iShiftBits – 1]));
     }

     return RShift;
     }

     private static long RotateLeft(long lValue, long iShiftBits)
     {
     long RotateLeft = 0;
     RotateLeft = LShift(lValue, iShiftBits) | RShift(lValue, (32 – iShiftBits));
     return RotateLeft;
     }

     private static long AddUnsigned(long lX, long lY)
     {
     long AddUnsigned = 0;
     long lX4 = 0;
     long lY4 = 0;
     long lX8 = 0;
     long lY8 = 0;
     long lResult = 0;

     lX8 = lX & 0x80000000;
     lY8 = lY & 0x80000000;
     lX4 = lX & 0x40000000;
     lY4 = lY & 0x40000000;

     lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
     if (Convert.ToBoolean(lX4 & lY4))
     {
     lResult = lResult ^ 0x80000000 ^ lX8 ^ lY8;
     }
     else if (Convert.ToBoolean(lX4 | lY4))
     {
     if (Convert.ToBoolean(lResult & 0x40000000))
     {
     lResult = lResult ^ 0xC0000000 ^ lX8 ^ lY8;
     }
     else
     {
     lResult = lResult ^ 0x40000000 ^ lX8 ^ lY8;
     }
     }
     else
     {
     lResult = lResult ^ lX8 ^ lY8;
     }
     AddUnsigned = lResult;
     return AddUnsigned;
     }

     private static long md5_F(long x, long y, long z)
     {
     long md5_F = 0;
     md5_F = (x & y) | ((~x) & z);
     return md5_F;
     }

     private static long md5_G(long x, long y, long z)
     {
     long md5_G = 0;
     md5_G = (x & z) | (y & (~z));
     return md5_G;
     }

     private static long md5_H(long x, long y, long z)
     {
     long md5_H = 0;
     md5_H = (x ^ y ^ z);
     return md5_H;
     }

     private static long md5_I(long x, long y, long z)
     {
     long md5_I = 0;
     md5_I = (y ^ (x | (~z)));
     return md5_I;
     }

     private static void md5_FF(ref long a, long b, long c, long d, long x, long s, long ac)
     {
     a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac));
     a = RotateLeft(a, s);
     a = AddUnsigned(a, b);
     }

     private static void md5_GG(ref long a, long b, long c, long d, long x, long s, long ac)
     {
     a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac));
     a = RotateLeft(a, s);
     a = AddUnsigned(a, b);
     }

     private static void md5_HH(ref long a, long b, long c, long d, long x, long s, long ac)
     {
     a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac));
     a = RotateLeft(a, s);
     a = AddUnsigned(a, b);
     }

     private static void md5_II(ref long a, long b, long c, long d, long x, long s, long ac)
     {
     a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac));
     a = RotateLeft(a, s);
     a = AddUnsigned(a, b);
     }

     private static long[] ConvertToWordArray(string sMessage)
     {
     long[] ConvertToWordArray = null;
     int lMessageLength = 0;
     int lNumberOfWords = 0;
     long[] lWordArray = null;
     int lBytePosition = 0;
     int lByteCount = 0;
     int lWordCount = 0;

     const int MODULUS_BITS = 512;
     const int CONGRUENT_BITS = 448;

     lMessageLength = sMessage.Length;
     lNumberOfWords = (((lMessageLength + ((MODULUS_BITS – CONGRUENT_BITS) / BITS_TO_A_BYTE)) / (MODULUS_BITS / BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS / BITS_TO_A_WORD);
     lWordArray = new long[lNumberOfWords];

     lBytePosition = 0;
     lByteCount = 0;

     while (lByteCount {
     lWordCount = lByteCount / BYTES_TO_A_WORD;
     lBytePosition = (lByteCount % BYTES_TO_A
     _WORD) * BITS_TO_A_BYTE;
     lWordArray[lWordCount] = lWordArray[lWordCount] | LShift(Convert.ToByte(sMessage.Substring(lByteCount, 1).ToCharArray()[0]), lBytePosition);
     lByteCount = lByteCount + 1;
     }

     lWordCount = lByteCount / BYTES_TO_A_WORD;
     lBytePosition = (lByteCount % BYTES_TO_A_WORD) * BITS_TO_A_BYTE;
     lWordArray[lWordCount] = lWordArray[lWordCount] | LShift(0x80, lBytePosition);
     lWordArray[lNumberOfWords – 2] = LShift(lMessageLength, 3);
     lWordArray[lNumberOfWords – 1] = RShift(lMessageLength, 29);
     ConvertToWordArray = lWordArray;

     return ConvertToWordArray;
     }

     private static string WordToHex(long lValue)
     {
     string WordToHex = “”;
     long lByte = 0;
     int lCount = 0;
     for (lCount = 0; lCount {
     lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) & m_lOnBits[BITS_TO_A_BYTE – 1];
     WordToHex = WordToHex + ((“0” + ToHex(lByte)).Substring((“0” + ToHex(lByte)).Length – 2));
     }
     return WordToHex;
     }

     private static string ToHex(long dec)
     {
     string strhex = “”;
     while (dec > 0)
     {
     strhex = tohex(dec % 16) + strhex;
     dec = dec / 16;
     }
     return strhex;
     }

     private static string tohex(long hex)
     {
     string strhex = “”;
     switch (hex)
     {
     case 10: strhex = “a”; break;
     case 11: strhex = “b”; break;
     case 12: strhex = “c”; break;
     case 13: strhex = “d”; break;
     case 14: strhex = “e”; break;
     case 15: strhex = “f”; break;
     default: strhex = hex.ToString(); break;
     }
     return strhex;
     }

     public static string Encrypt(string sMessage, int stype)
     {
     string MD5 = “”;

     for (int i = 0; i {
     m_lOnBits[i] = Convert.ToInt64(Math.Pow(2, i + 1) – 1);
     m_l2Power[i] = Convert.ToInt64(Math.Pow(2, i));
     }

     long[] x = null;
     int k = 0;
     long AA = 0;
     long BB = 0;
     long CC = 0;
     long DD = 0;
     long a = 0;
     long b = 0;
     long c = 0;
     long d = 0;

     const int S11 = 7;
     const int S12 = 12;
     const int S13 = 17;
     const int S14 = 22;
     const int S21 = 5;
     const int S22 = 9;
     const int S23 = 14;
     const int S24 = 20;
     const int S31 = 4;
     const int S32 = 11;
     const int S33 = 16;
     const int S34 = 23;
     const int S41 = 6;
     const int S42 = 10;
     const int S43 = 15;
     const int S44 = 21;

     x = ConvertToWordArray(sMessage);

     a = 0x67452301;
     b = 0xEFCDAB89;
     c = 0x98BADCFE;
     d = 0x10325476;

     for (k = 0; k {
     AA = a;
     BB = b;
     CC = c;
     DD = d;

     md5_FF(ref a, b, c, d, x[k + 0], S11, 0xD76AA478);
     md5_FF(ref d, a, b, c, x[k + 1], S12, 0xE8C7B756);
     md5_FF(ref c, d, a, b, x[k + 2], S13, 0x242070DB);
     md5_FF(ref b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
     md5_FF(ref a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
     md5_FF(ref d, a, b, c, x[k + 5], S12, 0x4787C62A);
     md5_FF(ref c, d, a, b, x[k + 6], S13, 0xA8304613);
     md5_FF(ref b, c, d, a, x[k + 7], S14, 0xFD469501);
     md5_FF(ref a, b, c, d, x[k + 8], S11, 0x698098D8);
     md5_FF(ref d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
     md5_FF(ref c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
     md5_FF(ref b, c, d, a, x[k + 11], S14, 0x895CD7BE);
     md5_FF(ref a, b, c, d, x[k + 12], S11, 0x6B901122);
     md5_FF(ref d, a, b, c, x[k + 13], S12, 0xFD987193);
     md5_FF(ref c, d, a, b, x[k + 14], S13, 0xA679438E);
     md5_FF(ref b, c, d, a, x[k + 15], S14, 0x49B40821);
     md5_GG(ref a, b, c, d, x[k + 1], S21, 0xF61E2562);
     md5_GG(ref d, a, b, c, x[k + 6], S22, 0xC040B340);
     md5_GG(ref c, d, a, b, x[k + 11], S23, 0x265E5A51);
     md5_GG(ref b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
     md5_GG(ref a, b, c, d, x[k + 5], S21, 0xD62F105D);
     md5_GG(ref d, a, b, c, x[k + 10], S22, 0x2441453);
     md5_GG(ref c, d, a, b, x[k + 15], S23, 0xD8A1E681);
     md5_GG(ref b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
     md5_GG(ref a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
     md5_GG(ref d, a, b, c, x[k + 14], S22, 0xC33707D6);
     md5_GG(ref c, d, a, b, x[k + 3], S23, 0xF4D50D87);
     md5_GG(ref b, c, d, a, x[k + 8], S24, 0x455A14ED);
     md5_GG(ref a, b, c, d, x[k + 13], S21, 0xA9E3E905);
     md5_GG(ref d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
     md5_GG(ref c, d, a, b, x[k + 7], S23, 0x676F02D9);
     md5_GG(ref b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
     md5_HH(ref a, b, c, d, x[k + 5], S31, 0xFFFA3942);
     md5_HH(ref d, a, b, c, x[k + 8], S32, 0x8771F681);
     md5_HH(ref c, d, a, b, x[k + 11], S33, 0x6D9D6122);
     md5_HH(ref b, c, d, a, x[k + 14], S34, 0xFDE5380C);
     md5_HH(ref a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
     md5_HH(ref d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
     md5_HH(ref c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
     md5_HH(ref b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
     md5_HH(ref a, b, c, d, x[k + 13], S31, 0x289B7EC6);
     md5_HH(ref d, a, b, c, x[k + 0], S32, 0xEAA127FA);
     md5_HH(ref c, d, a, b, x[k + 3], S33, 0xD4EF3085);
     md5_HH(ref b, c, d, a, x[k + 6], S34, 0x4881D05);
     md5_HH(ref a, b, c, d, x[k + 9], S31, 0xD9D4D039);
     md5_HH(ref d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
     md5_HH(ref c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
     md5_HH(ref b, c, d, a, x[k + 2], S34, 0xC4AC5665);
     md5_II(ref a, b, c, d, x[k + 0], S41, 0xF4292244);
     md5_II(ref d, a, b, c, x[k + 7], S42, 0x432AFF97);
     md5_II(ref c, d, a, b, x[k + 14], S43, 0xAB9423A7);
     md5_II(ref b, c, d, a, x[k + 5], S44, 0xFC93A039);
     md5_II(ref a, b, c, d, x[k + 12], S41, 0x655B59C3);
     md5_II(ref d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
     md5_II(ref c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
    md5_II(refb, c, d, a, x[k + 1], S44, 0x85845DD1);
     md5_II(ref a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
     md5_II(ref d, a, b, c, x[k
     + 15], S42, 0xFE2CE6E0);
     md5_II(ref c, d, a, b, x[k + 6], S43, 0xA3014314);
     md5_II(ref b, c, d, a, x[k + 13], S44, 0x4E0811A1);
     md5_II(ref a, b, c, d, x[k + 4], S41, 0xF7537E82);
     md5_II(ref d, a, b, c, x[k + 11], S42, 0xBD3AF235);
     md5_II(ref c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
     md5_II(ref b, c, d, a, x[k + 9], S44, 0xEB86D391);

     a = AddUnsigned(a, AA);
     b = AddUnsigned(b, BB);
     c = AddUnsigned(c, CC);
     d = AddUnsigned(d, DD);
     }

     if (stype == 32)
     {
     MD5 = ((((WordToHex(a)) + (WordToHex(b))) + (WordToHex(c))) + (WordToHex(d))).ToLower();
     }
     else
     {
     MD5 = ((WordToHex(b)) + (WordToHex(c))).ToLower();
     }
     return MD5;
     }
     }
    }

调用时,使用MD5.Encrypt(需要加密的string,加密类型16或者32)

how to get Text property of Label in DataList?

Normally when you want to do that you are doing it from within an event

raised by the DataList. I will assume that is where you are doing this from.

Here is a line of code that will get the Text property of the current Item:

CType(e.Item.FindControl(“lblMyLabel”), Label).Text

If you needed to access this data from a method/function other than one of

the events raised by the DataList, you will need to know the index of the

item the desired Label is in. In this case, use the following:

CType(DataList1.Items(index).FindControl(“lblMyLabel”), Label).Text

Please remember that when accessing data this way you must do it before

calling the databind() method in the case of databound properties (it

doesn’t look like your ItemTemplate has any databound properties, but I

assume it will), otherwise it will return a value of “”. Good Luck!

Nathan Sokalski

njsokalski@hotmail.com

http://www.nathansokalski.com/

“Arvan” <esato> wrote in message
[news:eiPOPqggGHA.2040@TK2MSFTNGP03.phx.gbl…](news:eiPOPqggGHA.2040@TK2MSFTNGP03.phx.gbl...)
> hi,all.
>
> i placed a datalist named DataList1 and placed a Label named Label1 in
> item template.
>
> how do i get the text of control Label?
>
> code:
>
><datalist id="DataList1" repeatcolumns="4" runat="server"></datalist>> RepeatLayout=”Flow” ShowFooter=”False” ShowHeader=”False”>
><itemtemplate>
><label id="img" runat="server" text="test"></label>> >
></itemtemplate>
>
></esato>

关于数据绑定的问题

最近写日志的时间太少了,真的对不起自己了。主要是忙着单位上的事情,还有就是学习.NET。下面就把我最近遇到的一些问题,写下来。

一。GridView的数据绑定问题。

在ASP.NET页面,如何绑定数据字段是一个可大可小的问题。为什么这么说那,你可以直接添加datasource控件,来绑定数据,这是最简单的。其次就是在代码页面添加代码后,绑定到控件上。

当我在编Weblog的程序时,我刚开始就是使用datasource控件完成这一切的,但是我觉得有些时候是datasource无法完成的,比如我写了一个类专门用来处理weblog的一些操作。比如添加日志,显示日志等等。这个时候,你就不能很轻松的绑定到数据控件上。

我在这里就是写写我的方法,如果其他人有比我更好的方法,请告诉我啊!谢谢。

首先,我们需要在内容页面添加GridView控件,增加一个模板列,然后将AutoGenerateColums设为False,这样就不会自动生成列字段了。然后我们编辑ItemTemplate,按照你想的样式进行布局,排列。然后,切换到源码视图,比如在itemtemplate模板里面增加了一个HyperLink控件用来显示作者,并且连接指向作者的email。现在在源码视图里面增加绑定的代码。

    <asp :hyperlink="" eval="" id="articlename" navigateurl="'<%#" runat="server">&#8216; ></asp>

好,现在heyperlink控件就绑定了2个数据字段,一个是email,还有一个是Username。Eval有2个可选参数,第一个是要绑定的字段,第二个是格式表达式。具体的关于Eval的说明,大家可以查阅MSDN。

现在内容页面已经做完了。只要在代码页面加入 GridView1.datasource = DataSet1;GridView1.databind();就可以了。这样数据绑定就在代码页面完成了,我可能说的不清楚,大家动手做一做就懂了。:)

2。另外一种数据绑定。来自MSDN。

请注意最后的那个Label控件的Text属性和SubmitBtn_Click事件。两者一结合,显然说明了另外一种数据绑定办法。

3。字符串的操作。

其实我说的字符串操作,主要是指连接多个字符串,因为我在写SQL语句的时候,每次sql语句都特长,就想分成几行写。

第一种连接方法就是 += 操作符。

  <textarea class="code" cols="50" rows="10">string a = ” this is”; <br /> a += ” a test”;</textarea>

输出以后,完整的a就是“this is a test”。

第二种连接方法是 + 运算符。

第三种办法就是 StringBuilder.

Using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append(“This is “);
sb.Append(“a test”);
string result = sb.toString();

就输出完整的result字符串“this is a test”。

期望这些给刚学习C#的新手一个tip吧。呵呵。

ASP.NET编程中的十大技巧

在本篇中,我们将讨论编程人员在使用ASP.NET开发应用程序时需要注意的10个技巧,这些技巧涉及从缺省的控件、表单名的改变到StringBuilder类的使用,有助于编程人员能够尽快地适应.NET环境。

1、在使用Visual Studio .NET时,除直接或非引用的对象外,不要使用缺省的名字。

.NET带来的好处之一是所有的源代码和配置文件都是纯文本文件,能够使用Notepad或WordPad等任意的文本编辑器进行编辑。如果不愿意,我们并非一定要使用Visual Studio .NET作为集成开发环境。但使用了Visual Studio .NET,我们可以在Windows文件管理器中看到文件,或在Visual Studio .NET之外从文本编辑器中浏览文件的内容。

使用Visual Studio .NET作为集成开发环境有许多好处,其中最显著的好处是它极大地提高了生产效率。使用Visual Studio. NET,我们能够在付出较小代价的情况下更快地开发软件。作为集成开发环境一部分的IntelliSense提供自动的代码完成、在输入方法或函数时提供动态帮助、语法错误的实时提示,以及其他能够提高生产效率的功能。

象其他复杂的工具那样,在学会如何充分发挥它的作用和掌握其“习性”前,Visual Studio .NET也会使我们产生一种挫折感。有时,它象一个难以了解的黑盒子,会生成大量的文件和许多无用的代码。

Visual Studio .NET的一个功能是,无论是类、控件或表单中的对象,它都能够为新对象提供缺省名字。例如,如果我们创建了一个新的ASP.NET Web Application,其缺省的名字将是WebApplication1。我们可以在“新工程”对话框中方便地改变该应用的名字,但同时改变的只是该应用程序的名字空间的名字及其所在的虚拟目录,源代码文件的缺省名字仍然是WebForm1.aspx和WebForm1.aspx.cs(C#工程)或WebForm1.aspx.vb(VB.NET工程)。

我们可以在方案浏览器中改变ASPX和代码使用的文件名字,但Web页类的名字仍然将是WebForm1。如果在该Web表单上生成一个按钮,其缺省的名字将是Button1。事实上,所有控件的名字都是由控件的类型和数字组成的。

我们能够,也应该将应用程序中所有的表单和控件的名字都修改成有意义的名字。对于较小的演示性程序而言,缺省的名字还能够胜任,但如果应用程序由多个表单,每个表单上有许多按钮和标签时,象frmStartup、frmDataEntry和frmReports这样的表单名就比Form1、Form2和Form3这样的名字更易于理解和维护。

如果表单上控件要在代码的其他地方引用,使它有一个有意义的名字就更重要了。btnOK、btnCancel和btnPrint这样的名字使看代码的人更容易理解,因而,也比名字为Button1、Button2、Button3这样的控件更容易维护。

修改一个工程中所有文件中出现的一个名字的一个好方法是,在Visual Studio .NET菜单中依次选择“编辑”->“发现和替换”->“替换”命令。

在看二周前编写的代码时,我们经常就象第一次见到这些代码一样,因此使它们有一个有助于我们理解其含义的名字是十分有必要的。

2、即使不使用Visual Studio .NET进行编程,使用代码支持文件也有利于提高应用程序的性能

在Web应用程序、Web服务或Web控件等所有的ASP.NET Web工程中,Visual Studio .NET都使用代码支持文件。代码支持文件使工程具有更好的组织、模块性,更适合多人组成的开发团队。另外,它还会带来性能的提高。

代码支持文件的内容被编译成一个组合文件中的类,一般是一个DLL文件,有时也可以是EXE文件。该文件驻留在应用程序的组合体高速缓冲区中,在应用程序启动时,可以立即得到它。

如果代码是包含在

3、尽量减少表单回送

每当点击Web网页上的Button、LinkButton或ImageButton控件时,表单就会被发送到服务器上。如果控件的AutoPostBack属性被设置为true,如果CheckBox、CheckBoxList等控件的状态被改变后,也会使表单会发送回服务器。

每次当表单被发送回服务器,就会被重新加载,启动Page_Load事件,执行Page_Load事件处理程序中的所有代码。把网页的初始化代码放在这里是最合适不过的了。我们经常会希望在每次加载网页时执行一些代码,而希望只有在网页第一次加载时执行另一些代码,甚至希望一些代码在除首次加载外的每次加载时执行。

可以利用IsPostBack特性来完成这一功能。在网页第一次加载时,该属性的值是false。如果网页因回送而被重新加载,IsPostBack属性的值就会被设置为true。通过测试,可以在任意时候执行指定的代码。下面是相关的C#代码:

protected void Page_Load(Object sender, EventArgs e)

{

// 网页每次加载时,执行的一些操作

if (!IsPostBack)

{

// 网页第一次加载时执行的操作

}

else

{

// 回送时执行的操作

}

// 网页每次加载时执行的操作

}

我们希望尽量不引起回送(每次回送都会要求服务器进行一系列的操作),即使引起回送后。也希望能够执行尽量少的操作。大规模、浪费时间的操作(例如数据库查找)尤其应当避免,因为它们能够延长应用程序的响应时间。

4、使用StringBuilder类

字符串在.NET框架中是不可变的,这意味着改变字符串的操作符和方法会返回字符串的改变后的拷贝,这意味着性能还有提高的空间。当进行大量的字符串操作时,使用StringBuilder类就是一种比较好的选择了。

下面的C#代码测试用二种方式从10000个子字符串中生成字符串所需要的时间。第一次使用了一个简单的字符串串联操作;第二次使用了StringBuilder类。要想查看结果字符串,可以去掉下面的代码中注解行的注解符号:

void Page_Load(Object Source, EventArgs E)

{

int intLimit = 10000;

DateTime startTime;

DateTime endTime;

TimeSpan elapsedTime;

string strSub;

string strWhole = &#8220;&#8221;;

// 首先执行字符串连接操作

startTime = DateTime.Now;

for (int i=0; i

二种方式的差别是相当大的:使用StringBuilder类的Append方法的速度比使用字符串连接的速度快近200倍。

5、只在必要时使用服务器端控件

ASP.NET中新引入了一种在服务器端运行的被称作Web Server Controls的控件,在代码中,它们经常通过下面的语法被说明:

<asp :textbox="" id="txtLastName" runat="server" size="40"></asp>

它们有时也被称作ASP控件。服务器端控件是由runat属性指示的,它的值总是“server”。

通过添加runat属性,一般的HTML控件可以被很方便地转换到服务器端运行,下面是一个简单的例子:

<input id="txtLastName" runat="server" size="40" type="text" /></input>

可以通过id属性中指定的名字,我们可以引用程序中的控件,可以通过编程的方式设置属性和获得值,因此,服务器端处理方式有较大的灵活性。

这种灵活性是有一定代价的。每种服务器端控件都会消耗服务器上的资源。另外,除非控件、网页或应用程序明确地禁止view state,控件的状态是包含在view state的隐藏域中,并在每次回送中都会被传递,这会引起严重的性能下降。

在这方面的一个很好的例子是,网页上控件表格的应用,如果不需要在代码中引用表格中的元素,则使用无需进行服务器端处理的HTML表格。我们仍然可以在HTML表格单元中放置服务器控件,并在代码中引用服务器控件。如果需要引用任意的表格元素,例如指定的单元,则整个表格必须是服务器控件。

6、HyperLink控件、LinkButton控件的差别

对于Web访问者而言,HyperLink、LinkButton控件是一样的,但它们在功能方面仍然有较大的差异。

当用户点击控件时,HyperLink控件会立即将用户“导航”到目标URL,表件不会回送到服务器上。LinkButton控件则首先将表件发回到服务器,然后将用户导航到目标URL。如果在“到达”目标URL之前需要进行服务器端处理,则使用LinkButton控件;如果无需进行服务器端处理,则可以使用HyperLink控件。

7、注释代码

这一技巧并不是针对ASP.NET的,但它是一个良好的编程习惯。

注释不仅仅应当说明代码会执行什么操作,还应当注明原因。例如,不要仅仅在注释中说明是在遍历数组,而是要说明遍历数组是根据某一算法计算一个值,除非算法是相当简单的,否则还应当对算法进行简要的说明。

.NET工程中的不同的编程语言都有各自不同的注释符号,下面是一个简要的说明:

HTML

JavaScript // 注释

VBScript ” 注释

VB.NET ” 注释

C# // 注释

/* 多行内容

的注释

*/

SQL — 注释

在服务器控件的开始和结束标记中没有注释符号,但服务器能够忽略掉所有它不能识别的属性,因此我们能够通过使用没有定义的属性来插入注释。下面是一个例子:

<asp :textbox=”” comment=””这是我的注释”” id=””txtLastName”” runat=””server”” size=””40″”></asp>

在Visual Studio .NET中对源代码进行注释非常简单。高亮度显示需要注释的行,然后按Ctrl+K+C组合键添加注释。要删除注释,只需高亮度显示被注释的代码,并按下Ctrl+K+U组合键。

在C#工程中,我们还可以通过在每行的开始处使用///输入XML注释小节。在注释小节中,我们可以使用下面的XML标记组织注释:

要在Visual Studio .NET中查看这些XML注释的格式化的报告,我们可以首先选择“工具”菜单项,然后选择“建立注释Web网页”菜单项。

8、使用trace方法和trace属性记录Page目录中网页的执行情况

调试程序的一种古老的技术是在程序中的关健点插入输出语句,通常情况下,输出信息中会包含重要变量的值,相关信息可以输出到屏幕、日志文件或者数据库。

在ASP.NET中,通过使用Page命令中的trace属性,这种调试技术的使用更简单了。Page命令是ASPX文件开始处的一行代码,它提供编译器的指示。Page命令中包含一个或多个属性,向编译器提供使用的编程语言、代码支持文件的位置或要继承的类的名字等信息。

Page命令中的属性之一是trace,其值可能是true或false,下面是一个典型的Page命令,其中的trace属性的值是true:

如果trace属性的值设置为true,由ASPX文件生成的Web页就会显示出来,除了网页本身外,关于该页的大量其他信息也会显示出来。这些信息以下面小节的形式显示在一张表格中:

·Request细节 提供Session ID、请求时间和请求的状态码。

·Trace Information 包含跟踪日志、网页生命周期中按时间先后顺序各个步骤的列表。另外,也可以向其中添加定制信息。

·控件树 以一种分层次的方式列出网页上的所有控件,包括每个控件以字节计算的大小。

·Cookies集合 列出该网页创建的所有Cookie。

·头部集合 HTTP头部以及它们的值。

·Server变量 与该网页相关的Server环境变量。

包含在Trace Information小节中的跟踪日志是最有用的,在这里我们可以插入自己的跟踪命令。trace类中有2个方法能够在跟踪日志中插入命令:Trace.Write和Trace.Warn,除了Trace.Warn命令用红色字体显示、Trace.Write命令用黑色字体显示外,它们是相同的。下面是跟踪日志的一个屏幕快照,其中包含有几个Trace.Warn命令。

跟踪日志中最方便的功能是我们可以在开发和测试过程中在整个代码中插入Trace.Write和Trace.Warn语句,而在最终交付应用程序时,可以通过改变Page命令中trace属性的值,禁止这些命令起作用,而无需在部署应用软件前删除这些输出语句。

9、使用存储过程

微软公司的SQL Server和其他现代关系数据库都使用SQL命令定义和处理查询。一个SQL语句或一系列SQL语句提交给SQL Server,SQL Server会对命令进行解析,然后创建一个查询计划并对它进行优化,然后执行该查询计划,这都需要大量的时间。

存储过程是一系列被查询处理器预解析和优化的SQL命令,这些命令会被存储起来,可以得到快速地执行。存储过程也被称作sprocs,它可以接收输入参数,使一个单一的存储过程能够处理较大范围的特定的查询。

因为sprocs是预先被解析的,对于复杂的查询更显得重要,其查询计划是预先优化的,因此调用查询过程比执行相同功能的SQL语句速度要快得多。

10、使用.NET命令行

.NET命令行工具在命令提示符窗口中运行。为了使命令能够执行,它必须驻留在命令提示符的当前目录中,或通过设置PATH环境变量。

.NET SDK在“启动”菜单上安装一个菜单项,该菜单项能够打开一个正确设置了PATH环境变量的命令提示符窗口。我们可以通过依次点击“开始”->“程序”->“Microsoft Visual Studio .NET”->“Visual Studio .NET工具”->“Visual Studio .NET命令提示符”,启动命令提示符窗口。

通过在将该菜单项从菜单上拖到桌面上时,同时按Ctrl+C键,就可以将该菜单项的快捷方式拷贝到桌面上,使用起来会非常方便。

ASP.NET中MD5加密码的方法

    <%@ Page Language="C#" ContentType="text/html"%>
    <%@ Import Namespace="System"%>
    <script language="C#" runat="server">
    void Page_Load(Object sender,EventArgs e){
    //获取要加密的字段,并转化为Byte[]数组
    }
    <script language="C#" runat="server">
    void Page_Load(Object sender,EventArgs e){
    //获取要加密的字段,并转化为Byte[]数组
    byte[] data=System.Text.Encoding.Unicode.GetBytes(source.Text.ToCharArray());
    //建立加密服务
    System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    //加密Byte[]数组
    byte[] result= md5.ComputeHash(data);
    //将加密后的数组转化为字段
    string sResult=System.Text.Encoding.Unicode.GetString(result);
    //显示出来
    sha1_1.Text="MD5普通加密:"+sResult.ToString()+"<br />";
    //作为密码方式加密
    string EnPswdStr=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(source.Text.ToString(),"MD5");
    //显示出来
    sha1_2.Text="MD5密码加密:"+EnPswdStr+"<br />";
    }
    </script>

FCKeditorWeb在线编辑器说明

现在网络上有很多不一样的web在线编辑器,大多数都是商业程序,要使用更多功能的话得掏钱。比如FreeTextbox,CuteEditor(听说它非常强大)。

我选择了FckEditor,主要它是轻量级的,功能丰富的,安装使用简单的,开源的在线编辑器,而且开源,下载的包里有项目文件,你可以按照自己的需要进行修改代码,然后再次生成组件。而且它支持IE 5.5+ (Windows), Firefox 1.0+, Mozilla 1.3+和Netscape 7+以上浏览器,并且支持ASP,CGI,PHP,ASP.NET,Java,ColdFusion,Python等脚本。

好了,闲话不说,我这里提一下在ASP.NET下一般的安装和使用方法。

1、下载FckEditor 2.3 Beta,它主要包括核心文件。

2、下载FckEditor 2.2 .Net ,包括ASP.NET的DLL文件,并且解压到任意目录。

3、解压FckEditor 2.3 Beta压缩包,将文件夹FCKeditor复制到网站的根目录,这里以ASP.NET 2.0的test项目为例,将其复制到test的根目录,并且在根目录下新建uploads目录用来存放编辑器上传得文件。

4、打开FCKeditor目录下的fckconfig.js文件,将FCKConfig.DefaultLanguage的值改为zh-cn使其的界面语言改变为简体中文,_FileBrowserLanguage和_QuickUploadLanguage的值都改为aspx。可选的修改如下,可以修改编辑器的skin,将FCKConfig.SkinPath = FCKConfig.BasePath + ‘skins/default/’ 的default可以该为office2003或者silver。保存修改,关闭文件。

5、打开test项目的web.config文件,在节点下增加。不知道为什么FCKeditor不支持相对路径,如果设置为“~/uploads”就是用不了,上传得文件地址都变成”<http://localhost/~/uploads/xxxxxx.jpg”这样的了。在><system .web="">节点下增加,要不然当在编辑器里输入字符保存时,会出现“检测到有潜在危险对象的Request.form值”的警告,好了,保存文件。</system>

6、在项目中引用刚才解压的FCKeditor.NET压缩包里的FredCK.FCKeditorV2.dll文件。具体位置是 FCKeditor.Net_2.2/bin/release/FredCK.FCKeditorV2.dll

7、打开test项目的default.aspx页面,在

下面加入以下代码

然后就可以在default.aspx页面使用这个控件了:

    <fckeditorv2 :fckeditor="" basepath="~/FCKeditor/" enablesourcexhtml="true" enablexhtml="true" height="500px" id="FCKeditor" runat="server" width="580px"></fckeditorv2>

8、如何取得编辑器中的文本。该控件有个属性是value,它就是获得编辑器中的文本的。

9、FCKeditor控件的属性和事件。

具有的属性列表如下:

    AutoDetectLanguage
    BaseHref
    BasePath
    ContentLangDirection
    CustomConfigurationsPath
    Debug
    DefaultLanguage
    EditorAreaCSS
    EnableSourceXHTML
    EnableViewState
    EnableXHTML
    FillEmptyBlocks
    FontColors
    FontFormats
    FontNames
    FontSizes
    ForcePasteAsPlainText
    ForceSimpleAmpersand
    FormatIndentator
    FormatOutput
    FormatSource
    FullPage
    GeckoUseSPAN
    Height
    ID
    ImageBrowserURL
    LinkBrowserURL
    PluginsPath
    runat
    SkinPath
    StartupFocus
    StylesXMLPath
    TabSpaces
    ToolbarCanCollapse
    ToolbarSet
    ToolbarStartExpanded
    UseBROnCarriageReturn
    Value
    Visible
    Width

具体的事件列表如下:

    OnDataBinding
    OnDisposed
    OnInit
    OnLoad
    OnPreRender
    OnUnload

10、其他

官方网站的support上提到,如果使用asp.net 2.0和theme,那么需要打开editorfilemanageruploadaspxupload.aspx和editorfilemanagerrowserdefaultconnectorsaspxconnector.aspx文件,并且在第一行中加入Theme=”” 。比如

如果还有什么不知道,可以访问 http://www.fckeditor.net/

编辑器下载:

"下载文件"点击下载FCKeditor v2.3 Beta

"下载文件"点击下载FCKeditor.Net_2.2

SQL语法参考

一、数据定义语言 ddl(data definition language)

数据定义语言是指对数据的格式和形态下定义的语言,它是每个数据库要建立时候时首先要面对的,举凡数据分哪些表格关系、表格内的有什麽字段主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。

1、建立表格:

一、数据定义语言 ddl(data definition language)

数据定义语言是指对数据的格式和形态下定义的语言,它是每个数据库要建立时候时首先要面对的,举凡数据分哪些表格关系、表格内的有什麽字段主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。

1、建立表格:

create table table_name(

column1 datatype [not null] [not null primary key],

column2 datatype [not null],

…)

说明: 

datatype –是数据的格式,详见表。

not null –可不可以允许数据有空的(尚未有资料填入)。

primary key –是本表的主键。

2、更改表格 

alter table table_name

add column column_name datatype

说明:增加一个字段(没有删除某个字段的语法。)

alter table table_name

add primary key (column_name)

说明:更改表得的定义把某个字段设为主键。

alter table table_name

drop primary key (column_name)

说明:把主键的定义删除。

3、建立索引 

create index index_name on table_name (column_name)

说明:对某个表格的字段建立索引以增加查询时的速度。

4、删除表,删除索引

drop table_name

drop index_name

二、数据类型 datatypes

smallint

16 位元的整数。

interger

32 位元的整数。

decimal(p,s)

p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数

点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。

float

32位元的实数。

double

64位元的实数。

char(n)

n 长度的字串,n不能超过 254。

varchar(n)

长度不固定且其最大长度为 n 的字串,n不能超过 4000。

graphic(n)

和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为

了支援两个字元长度的字体,例如中文字。

vargraphic(n)

可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。

date

包含了 年份、月份、日期。

time

包含了 小时、分钟、秒。

timestamp

包含了 年、月、日、时、分、秒、千分之一秒。

三、数据操作语言 dml (data manipulation language)

数据定义好之後接下来的就是数据的操作。数据的操作不外乎增加记录(insert)、查询数据(query)、更改记录(update) 、删除记录(delete)四种模式,以下分别介绍他们的语法:

1、增加记录:

insert into table_name (column1,column2,…)

values ( value1,value2, …)

说明:

1.若没有指定column 系统则会按表格内的字段顺序填入资料。

2.字段的数据类型和所填入的数据必须吻合。

3.table_name 也可以是视图 view_name。

insert into table_name (column1,column2,…)

select columnx,columny,… from another_table

说明:也可以经过一个子查询(subquery)把别的表格的数据填入。

2、查询数据:

基本查询

select column1,columns2,…

from table_name

说明:把table_name 的特定字段数据全部列出来

select *

from table_name

where column1 = xxx

[and column2 > yyy] [or column3 zzz]

说明:

1.’*’表示全部的字段都列出来。

2.where 之後是接条件表达式,把符合条件的数据列出来。

select column1,column2

from table_name

order by column2 [desc]

说明:order by 是指定以某个字段做排序,[desc]是指从大到小排列,若没有指明,则是从小到大

排列。

组合查询

组合查询是指所查询得数据来源并不只有单一的表格,而是联合一个以上的

表格才能够得到结果的。

select *

from table1,table2

where table1.colum1=table2.column1

说明:

1.查询两个表格中其中 column1 值相同的数据。

2.当然两个表格相互比较的字段,其数据类型必须相同。

3.一个复杂的查询其动用到的表格可能会很多个。

整合性的查询:

select count (*)

from table_name

where column_name = xxx

说明:

查询符合条件的数据有多少项。count(column_name),计算某个字段的记录数。

select sum(column1)

from table_name

说明:

1.计算出总和,所选的字段必须是可数的数字类型。

2.除此以外还有 avg() 是计算平均、max()、min()计算最大最小值的整合性查询。

select column1,avg(column2)

from table_name

group by column1

having avg(column2) > xxx

说明:

1.group by: 以column1 为一组计算 column2 的平均值必须和 avg、sum等整合性查询的关键字

一起使用。

2.having : 必须和 group by 一起使用作为整合性的限制。

复合性的查询

select *

from table_name1

where exists (

select *

from table_name2

where conditions )

说明:

1.where 的 conditions 可以是另外一个的 query。

2.exists 在此是指存在与否。

select *

from table_name1

where column1 in (

select column1

from table_name2

where conditions )

说明: 

  1. in 後面接的是一个集合,表示column1 存在集合里面。

  2. select 出来的资料形态必须符合 column1。

其他查询

select *

from table_name1

where column1 like ‘x%’

说明:like 必须和後面的’x%’ 相呼应表示以 x为开头的字串。

select *

from table_name1

where column1 in (‘xxx’,’yyy’,..)

说明:in 後面接的是一个集合,表示column1 存在集合里面。

select *

from table_name1

where column1 between xx and yy

说明:between 表示 column1 的值介於 xx 和 yy 之间。

3、更改记录:

update table_name

set column1=’xxx’

where conditoins

说明:

1.更改某个字段,设定其值为’xxx’。

2.conditions 是所要符合的条件、若没有 where 则整个 table 的字段都会全部被更改。

4、删除记录:

delete from table_name

where conditions

说明:删除符合条件的记录。

说明:关于where条件后面如果包含有日期的比较,不同数据库有不同的表达式。具体如下:

(1)如果是access数据库,则为:where mydate>#2000-01-01#

(2)如果是oracle数据库,则为:where mydate>cast(‘2000-01-01’ as date)

或:where mydate>to_date(‘2000-01-01′,’yyyy-mm-dd’)

在delphi中写成:

thedate=’2000-01-01′;

query1.sql.add(‘select * from abc where mydate>cast(‘+””+thedate+””+’ as date)’);

如果比较日期时间型,则为:

where mydatetime>to_date(‘2000-01-01 10:00:01′,’yyyy-mm-dd hh24:mi:ss’)

ASP.NET与SQL数据库连接方面的笔记

ASP.NET连接数据库可以使用VS提供的空间DATASOURCE,包括Sqldatasource,objectdatasource,xmldatasource,AccessDatasource。

连接数据库一般是三步,先建立连接,执行SQL命令,关闭连接。

当然,可以先把连接数据库字符串写入Web.Config文件,然后调用。

方法如下:

       SqlConnection aconn = new SqlConnection(ConfigurationManager.AppSettings.Get(“Conn”));
            aconn.Open();
            string sql1=”Insert into table(colum1,colum2,colum3) values ('Value1','Value2','value3')”;
            SqlCommand command = new SqlCommand(sql1,aconn);
            command.ExecuteNonQuery(); //执行查询,返回成功或者失败。
            aconn.Close();

而Web.Config文件的Conn字符串则如下:

    <appSettings>
      <add key=”Conn” value=”Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory| able.mdf;Integrated Security=True;User Instance=True” />
     </appSettings>

这样就是一个基本的连接数据库的例子。

C#.NET 2005视频学习资料(2007-5-24更新)

这是微软MSDN提供的16节课的C#视频教程,非常适合入门学习。通过创建一个具体的解决方案,了解C#,学习C#,非常好。

大小就是180多M,我已经放在MOFILE了,大家可以下载学习看看。

地址如下:

http://www1.51ok.com/down.do?17F2F2480F6B8741793E40506F89C54E

这次不限制时间了,大家可以尽情的下载了。呵呵。

请查阅该文章:http://www.arvan.net.ru/article.asp?id=273

关于引用控件值的问题

昨天在写类的时候,遇到了一个问题,就是如何在类中引用form里面控件的问题。我问了几个朋友,但是给出的方法都存在问题。下面是刘工给我的一个解决办法。

1。首先需要在Program.cs里面,main()函数以外,声明如下语句:

public static Form1 frmMain;

通常在main()函数之上。

2。在main()函数内声明如下语句

frmMain = new Form1();
Application.Run(frmMain);
或者
Application.Run(frmMain = new Form1());

3。在win app窗体内将需要传递值的控件的modifiers属性改为Public,因为只有是public访问修饰符时,才可以在任何地方访问。

4。在类中调用控件值。使用下面的代码:

Program.frmMain.txtBox1.Text…..

代码仅供参考,如果哪位朋友有更好的方法,我愿闻其详。:-)