2006年12月24日

1、定制模板。

可以先在网站建一Skins目录,这样将所有的模板都统一放在它之下。

接着添加模板,在该目录下添加新项:Master.Page。命名为:<指定名字>.master。创建之后会发现它和新建的一个ASPX页面没什么太多区别。所以也应可以通过制作普通页面的方面来设计它。只不过,对于需要在不同场合由于不同内容来替换的地方用:Contentplaceholder组件来定义就行。这样,一个模板就制作好了。完成后的代码如:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Skin2.master.cs" Inherits="Skins_Skin2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        &nbsp;<table border="1" bordercolor="#ffcc66" cellpadding="0" cellspacing="0" style="width: 606px">
            <tr>
                <td colspan="3" style="height: 234px">
                    <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
                    </asp:ContentPlaceHolder>
                </td>
            </tr>
            <tr>
                <td>
                    <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
                    </asp:ContentPlaceHolder>
                    dsfsdaf</td>
                <td style="width: 4px">
                </td>
                <td>
                    <asp:ContentPlaceHolder ID="ContentPlaceHolder4" runat="server">
                        sdfdsafasd122</asp:ContentPlaceHolder>
                    sdfsdadsafsd</td>
            </tr>
            <tr>
                <td>
                    <asp:ContentPlaceHolder ID="ContentPlaceHolder3" runat="server">
                    </asp:ContentPlaceHolder>
                </td>
                <td style="width: 4px">
                </td>
                <td>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

2、使用模板。

建一个你要显示内容的ASPX页面。将里面的所有html元素全清掉。注意保留下:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
这行

完后在该面页中通过<asp:Content>来定义及实现每一块的在模板中通过Contentplaceholder已定义的区域。如:

<asp:Content ID="content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">

        <asp:Panel ID="Panel3" runat="server" Height="50px" Width="125px">
            <asp:DropDownList name="dfgddf" ID="DropDownList1" runat="server">
            </asp:DropDownList></asp:Panel>
   
        <asp:Panel ID="Panel4" runat="server" Height="50px" Width="125px">
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        </asp:Panel>
   
</asp:Content>

完后,再在Page_PreInit中加载需要用的模板。如:

   protected void Page_PreInit(object sender, EventArgs e)
    {
        this.MasterPageFile = "Skins/Skin2.master";//实际使用时,可以在别处先设定模板,完后该处读取指定的模板,当然这个处理就可以多种多样了。
    }

posted @ 2006-12-24 11:26 javalong 阅读(528) 评论(1) 编辑


2006年11月23日

防止sql注入,通常一个一个文件修改不仅麻烦而且还有漏掉的危险,下面我说一上如何从整个系统防止注入。

做到以下三步,相信的程序将会比较安全了,而且对整个网站的维护也将会变的简单。

一、数据验证类:
parameterCheck.cs

public class parameterCheck{
 public static bool isEmail(string emailString){
 return System.Text.RegularExpressions.Regex.IsMatch(emailString, "['//w_-]+(//.['//w_-]+)*@['//w_-]+(//.['//w_-]+)*//.[a-zA-Z]{2,4}");
 }
 public static bool isInt(string intString){
 return System.Text.RegularExpressions.Regex.IsMatch(intString ,"^(//d{5}-//d{4})|(//d{5})$");
 }
 public static bool isUSZip(string zipString){
 return System.Text.RegularExpressions.Regex.IsMatch(zipString ,"^-[0-9]+$|^[0-9]+$");
 }
}


二、Web.config

在你的Web.config文件中,在<appSettings>下面增加一个标签:如下
 <appSettings>
 <add key="safeParameters" value="OrderID-int32,CustomerEmail-email,ShippingZipcode-USzip" />
</appSettings>

其中key是<saveParameters>后面的值为"OrderId-int32"等,其中"-"前面表示参数的名称比如:OrderId,后面的int32表示数据类型。

三、Global.asax

在Global.asax中增加下面一段:

protected void Application_BeginRequest(Object sender, EventArgs e){
 String[] safeParameters = System.Configuration.ConfigurationSettings.AppSettings["safeParameters"].ToString().Split(',');
 for(int i= 0 ;i < safeParameters.Length; i++){
 String parameterName = safeParameters[i].Split('-')[0];
 String parameterType = safeParameters[i].Split('-')[1];
 isValidParameter(parameterName, parameterType);
 }
}

public void isValidParameter(string parameterName, string parameterType){
 string parameterValue = Request.QueryString[parameterName];
 if(parameterValue == null) return;

 if(parameterType.Equals("int32")){
 if(!parameterCheck.isInt(parameterValue)) Response.Redirect("parameterError.aspx");
 }
 else if (parameterType.Equals("double")){
 if(!parameterCheck.isDouble(parameterValue)) Response.Redirect("parameterError.aspx");
 }
 else if (parameterType.Equals("USzip")){
 if(!parameterCheck.isUSZip(parameterValue)) Response.Redirect("parameterError.aspx");
 }
 else if (parameterType.Equals("email")){
 if(!parameterCheck.isEmail(parameterValue)) Response.Redirect("parameterError.aspx");
 }
}
 

以后需要修改的时候我们只需要修改以上三个文件,对整个系统的维护将会大大提高效率,当然你可以根据自己的需要增加其它的变量参数和数据类型。

posted @ 2006-11-23 19:42 javalong 阅读(253) 评论(0) 编辑


2006年10月30日

随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。

  1. ~ 的用法

  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不同层次的两个目录的aspx文件分别引用时,问题就会出现了。

  ~/image/about.bmp 是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览它。

  2. 在刷新和提交页面后,保存你的页面滚动条的位置

  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370个控件又需要他选择一下?

  用下面的方法可以很快地确定和记住你提交前的位置。

  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,不过他使用了Web Behavior这意味着你需要使用一个.htc文件

Private Sub RetainScrollPosition()

Dim saveScrollPosition As New StringBuilder
Dim setScrollPosition As New StringBuilder

RegisterHiddenField("__SCROLLPOS", "0")
saveScrollPosition.Append("<script language='javascript'>")
saveScrollPosition.Append("function saveScrollPosition() {")
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = thebody.scrollTop;")
saveScrollPosition.Append("}")
saveScrollPosition.Append("thebody.onscroll=saveScrollPosition;")
saveScrollPosition.Append("</script>")

RegisterStartupScript("saveScroll", saveScrollPosition.ToString())

If (Page.IsPostBack = True) Then

setScrollPosition.Append("<script language='javascript'>")
setScrollPosition.Append("function setScrollPosition() {")
setScrollPosition.Append(" thebody.scrollTop = " & Request("__SCROLLPOS") & ";")
setScrollPosition.Append("}")
setScrollPosition.Append("thebody.onload=setScrollPosition;")
setScrollPosition.Append("</script>")
RegisterStartupScript("setScroll", setScrollPosition.ToString())

End If

End Sub

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
RetainScrollPosition()
End Sub
  3. DataList使用不同风格的模板

  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个元素或是加一个促销广告图等等。

Dim theme As String
theme = DropDownList1.SelectedValue

DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
DataList1.DataSource = DS
DataList1.DataBind()

  4. 设置服务器端控件的焦点

Private Sub SetFocus(ByVal controlToFocus As Control)
Dim scriptFunction As New StringBuilder
Dim scriptClientId As String

scriptClientId = controlToFocus.ClientID
scriptFunction.Append("<script language='javascript'>")
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
scriptFunction.Append("</script>")
RegisterStartupScript("focus", scriptFunction.ToString())
End Sub

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If (Page.IsPostBack = False) Then
SetFocus(TextBox1)
End If
End Sub

  5. 滚动DataGrid

  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控件放在一个DIV中将overflow属性设置成auto

<div style=“height:400px;width:200px;overflow:auto”>
<asp:datagrid id=“MyGrid” runat=“server”/>
</div>

  6. 动态创建控件

  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。

Sub Page_Load()
Dim i as Integer
For i=0 to 4
Dim myUserControl as Control
myUserControl = Page.LoadControl(“foo.ascx”)
PlaceHolder1.Controls.Add(myUserControl)
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
Next i
End Sub

  7. 客户端代码的使用

  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性

asp:ImageButton id=“foo”
ImageUrl=“start.jpg”
onMouseOver=“rollover(this);”
onMouseOut=“rollout(this)”
rolloversrc=“myrollover.jpg”
rolloutsrc=“myrollout.jpg”
runat=“server”/>

<input type=Button onClick=“return clientHandler()”
onServerClick=“Button1_Click” … />

  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所有的客户端控件。

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles MyBase.Load
 RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
End Sub

  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术

posted @ 2006-10-30 12:55 javalong 阅读(1831) 评论(0) 编辑


2006年10月16日

生活中其实很多地方的计数方法都多少有点不同进制的影子。

比如我们最常用的10进制,其实起源于人有10个指头。如果我们的祖先始终没有摆脱手脚不分的境况,我想我们现在一定是在使用20进制。

至于二进制……没有袜子称为0只袜子,有一只袜子称为1只袜子,但若有两袜子,则我们常说的是:1双袜子。

生活中还有:七进制,比如星期。十六进制,比如小时或“一打”,六十进制,比如分钟或角度……

 

6.1 为什么需要八进制和十六进制?

 

编程中,我们常用的还是10进制……必竟C/C++是高级语言。

比如:

int a = 100,b = 99;

不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。

但,二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:

0000 0000 0000 0000 0110 0100

面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。

 

用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?

2、8、16,分别是2的1次方,3次方,4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。在下面的关于进制转换的课程中,你可以发现这一点。

 

6.2 二、八、十六进制数转换到十进制数

6.2.1 二进制数转换为十进制数

二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……

所以,设有一个二进制数:0110 0100,转换为10进制为:

下面是竖式:

 

0110 0100 换算成 十进制

 

第0位 0 * 20  =  0

第1位 0 * 21  =  0

第2位 1 * 22  =  4

第3位 0 * 23  =  0

第4位 0 * 24  =  0

第5位 1 * 25  = 32

第6位 1 * 26  = 64

第7位 0 * 27  =  0     +

---------------------------

              100  

 

用横式计算为:

0 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100

 

0乘以多少都是0,所以我们也可以直接跳过值为0的位:

1 * 22 + 1 * 23 +  1 * 25 + 1 * 26 = 100

 

6.2.2 八进制数转换为十进制数

八进制就是逢8进1。

八进制数采用 0~7这八数来表达一个数。

八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……

所以,设有一个八进制数:1507,转换为十进制为:

用竖式表示:

 

1507换算成十进制。

 

第0位 7 * 80 = 7

第1位 0 * 81 = 0

第2位 5 * 82 = 320

第3位 1 * 83 = 512   +

--------------------------

              839

同样,我们也可以用横式直接计算:

7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839

 

结果是,八进制数 1507 转换成十进制数为 839

 

6.2.3 八进制数的表达方法

C,C++语言中,如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或12345670,那么它是八进制数还是10进制数,都有可能。

所以,C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。

由于C和C++都没有提供二进制数的表达方法,所以,这里所学的八进制是我们学习的,CtC++语言的数值表达的第二种进制法。

现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在变量初始化时:

 

int a = 100;

我们也可以这样写:

int a = 0144; //0144是八进制的100;一个10进制数如何转成8进制,我们后面会学到。

 

千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。

 

6.2.4 八进制数在转义符中的使用

我们学过用一个转义符'\'加上一个特殊字母来表示某个字符的方法,如:'\n'表示换行(line),而'\t'表示Tab字符,'\''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符'\'后面接一个八进制数,用于表示ASCII码等于该值的字符。

比如,查一下第5章中的ASCII码表,我们找到问号字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '\77'来表示'?'。由于是八进制,所以本应写成 '\077',但因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。

事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,6.2.4小节的内容,大家仅仅了解就行。

 

6.2.5 十六进制数转换成十进制数

2进制,用两个阿拉伯数字:0、1;

8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;

10进制,用十个阿拉伯数字:0到9;

16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?

 

16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。

十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……

所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。

假设有一个十六进数 2AF5, 那么如何换算成10进制呢?

 

用竖式计算:

 

2AF5换算成10进制:

 

第0位:  5 * 160 = 5

第1位:  F * 161 = 240

第2位:  A * 162 = 2560

第3位:  2 * 163 = 8192  +

-------------------------------------

                 10997 

直接计算就是:

5 * 160  + F * 161 + A * 162 + 2 * 163 = 10997

(别忘了,在上面的计算中,A表示10,而F表示15)

 

现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。

假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他这么一个算式:

1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100

 

6.2.6  十六进制数的表达方法

如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看不出它是16进制或10进制。

C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不区分大小写。(注意:0x中的0是数字0,而不是字母O)

以下是一些用法示例:

 

int a = 0x100F;

int b = 0x70 + a;

 

至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,C,C++并不把它当成一个负数。

 

6.2.7 十六进制数在转义符中的使用

 

转义符也可以接一个16进制数来表示一个字符。如在6.2.4小节中说的 '?' 字符,可以有以下表达方式:

 

'?'     //直接输入字符

'\77'   //用八进制,此时可以省略开头的0

'\0x3F' //用十六进制

 

同样,这一小节只用于了解。除了空字符用八进制数 '\0' 表示以外,我们很少用后两种方法表示一个字符。

 

6.3 十进制数转换到二、八、十六进制数

6.3.1 10进制数转换为2进制数

 

给你一个十进制,比如:6,如果将它转换成二进制数呢?

 

10进制数转换成二进制数,这是一个连续除2的过程:

把要转换的数,除以2,得到商和余数,

将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。

 

听起来有些糊涂?我们结合例子来说明。比如要转换6为二进制数。

 

“把要转换的数,除以2,得到商和余数”。

 那么:

 要转换的数是6, 6 ÷ 2,得到商是3,余数是0。 (不要告诉我你不会计算6÷3!)

 

“将商继续除以2,直到商为0……”

现在商是3,还不是0,所以继续除以2。

那就: 3 ÷ 2, 得到商是1,余数是1

 

“将商继续除以2,直到商为0……”

现在商是1,还不是0,所以继续除以2。

那就: 1 ÷ 2, 得到商是0,余数是1 (拿笔纸算一下,1÷2是不是商0余1!)

 

“将商继续除以2,直到商为0……最后将所有余数倒序排列”

好极!现在商已经是0。

我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!

 

6转换成二进制,结果是110。

 

把上面的一段改成用表格来表示,则为:

被除数 计算过程 余数
6 6/2 3 0
3 3/2 1 1
1 1/2 0 1

(在计算机中,÷用 / 来表示)

 

如果是在考试时,我们要画这样表还是有点费时间,所更常见的换算过程是使用下图的连除:

(图:1)

请大家对照图,表,及文字说明,并且自已拿笔计算一遍如何将6转换为二进制数。

说了半天,我们的转换结果对吗?二进制数110是6吗?你已经学会如何将二进制数转换成10进制数了,所以请现在就计算一下110换成10进制是否就是6。

 

6.3.2 10进制数转换为8、16进制数

 

非常开心,10进制数转换成8进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成8。

 

来看一个例子,如何将十进制数120转换成八进制数。

 

用表格表示:

被除数 计算过程 余数
120 120/8 15 0
15 15/8 1 7
1 1/8 0 1

 

120转换为8进制,结果为:170。

 

非常非常开心,10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成16。

 

同样是120,转换成16进制则为:

被除数 计算过程 余数
120 120/16 7 8
7 7/16 0 7

 

120转换为16进制,结果为:78。

 

请拿笔纸,采用(图:1)的形式,演算上面两个表的过程。

 

6.4 二、十六进制数互相转换

 

二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。

我们也一样,只要学完这一小节,就能做到。

首先我们来看一个二进制数:1111,它是多少呢?

你可能还要这样计算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。

然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为23 = 8,然后依次是 22 = 4,21=2, 20 = 1。

 

记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。

 

下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)

 

仅4位的2进制数  快速计算方法   十进制值     十六进值

1111        = 8 + 4 + 2 + 1  = 15          F

1110        = 8 + 4 + 2 + 0  = 14          E

1101        = 8 + 4 + 0 + 1  = 13          D          

1100        = 8 + 4 + 0 + 0  = 12          C          

1011        = 8 + 4 + 0 + 1  = 11          B          

1010        = 8 + 0 + 2 + 0  = 10          A

1001        = 8 + 0 + 0 + 1  = 10          9

....

0001        = 0 + 0 + 0 + 1  = 1           1

0000        = 0 + 0 + 0 + 0  = 0           0

 

二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。

如(上行为二制数,下面为对应的十六进制):

 

1111 1101 , 1010 0101 , 1001 1011

 F    D   ,  A    5   ,  9    B  

 

反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?

先转换F:

看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。

接着转换 D:

看到D,知道它是13,13如何用8421凑呢?应该是:8 + 2 + 1,即:1011。

所以,FD转换为二进制数,为: 1111 1011

 

由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。

比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:

被除数 计算过程 余数
1234 1234/16 77 2
77 77/16 4 13 (D)
4 4/16 0 4

 

结果16进制为: 0x4D2

 

然后我们可直接写出0x4D2的二进制形式: 0100 1011 0010。

其中对映关系为:

0100 -- 4

1011 -- D

0010 -- 2

 

同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。

下面举例一个int类型的二进制数:

01101101 11100101 10101111 00011011

我们按四位一组转换为16进制: 6D E5 AF 1B

posted @ 2006-10-16 14:49 javalong 阅读(1048) 评论(3) 编辑


2006年9月24日

关于ISA内网卡网线拔插造成ISA代理失效问题的一种解决方法

关于ISA内网卡网线拔下一段时间再接上(或者交换机断电一段时间),ISA代理失效

没拔网线前,ISA防火墙服务在内网卡IP侦听tcp8080,tcp1745,udp1745
拔掉网线后,ISA防火墙服务在内网卡IP不在侦听以上三个端口
重新接上网线,ISA防火墙服务在内网卡IP侦听tcp1745,udp1745,没有再侦听tcp8080了
随即在ISA警报中发现提示:
资源分配失败
Web Proxy 筛选器无法将其套接字绑定到 10.0.0.1 端口 8080。这可能是由于另一个服务在使用同一端口或由于网络适配器不能正常工作而引起的。要解决此问题,请重新启动 Microsoft 防火墙服务。在事件属性的数据区域内指定的错误代码指明了失败的原因。
由于下列错误而失败:0x80072740
此时ISA的代理功能已失效

此问题的解决可以通过禁用Windows的“媒体感知”功能
http://support.microsoft.com/KB/239924
需要修改注册表
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
添加以下注册表值:
数值名称:DisableDHCPMediaSense
数据类型:REG_DWORD
数值数据范围:0,1(False,True)默认值:0 (False)
说明:此参数控制 DHCP 媒体感知行为。如果将该数值数据设置为 1,DHCP(甚至非 DHCP)客户端忽略接口中的媒体感知事件。默认情况下,媒体感知事件触发 DHCP 客户端执行操作,如试图获取租约(当发生连接事件时),或者使接口和路由无效(当发生连接断开事件时)。

添加该注册表值并设置为1后,重启计算机,此问题得到解决!

无论是拔掉网线还是重新接上网线,ISA防火墙服务都依然侦听tcp8080,tcp1745,udp1745三个端口
如何在 Windows 中为 TCP/IP 禁用“媒体感知”
察看这篇文章对应的产品
文章 ID : 239924
最后更新日期 : 2004年6月25日
版本 : 6.0

重要说明:本文包含有关修改注册表的信息。修改注册表之前,一定要备份注册表,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和编辑注册表的信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986 Microsoft Windows 注册表说明
本页内容
概要
更多信息
这篇文章中的信息适用于:

概要
Windows 包含“媒体感知”功能。在使用传输控制协议/Internet 协议 (TCP/IP) 且基于 Windows 的计算机上,您可以使用此功能检测网络媒体是否处于“链接状态”。按照定义,“链接状态”是指物理媒体与网络连接或插入到网络中。例如,假定计算机上有一个 10bt 或 100bt 的物理媒体,以太网网络适配器和集线器通常有一个指示当前连接状态的“链接”灯。这与 Windows 检测链接时的情况相同。只要 Windows 检测到媒体处于“故障”状态,它就会从该适配器中删除绑定的协议,直到检测到该适配器重新“正常工作”时为止。在某些情况下,您可能不希望网络适配器检测此状态,您可以通过编辑注册表进行此类配置。

注意:10b2 或同轴 (RG-58) 以太网电缆不是基于连接的媒体。为此,如果使用此类电缆,Windows 并不试图检测“连接”状态。
返回页首

更多信息
警告:注册表编辑器使用不当可导致严重问题,可能需要重新安装操作系统。Microsoft 不能保证您可以解决因注册表编辑器使用不当而导致的问题。使用注册表编辑器需要您自担风险。
若要禁止网络适配器检测链接状态,请按照下列步骤操作:

注意:NetBEUI 和 IPX 无法识别“媒体感知”。 1. 使用注册表编辑器 (Regedt32.exe) 来查看下面的注册表项:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
添加以下注册表值:
数值名称:DisableDHCPMediaSense
数据类型:REG_DWORD - 布尔值
数值数据范围:0,1(False,True)默认值:0 (False)
说明:此参数控制 DHCP 媒体感知行为。如果将该数值数据设置为 1,DHCP(甚至非 DHCP)客户端忽略接口中的媒体感知事件。默认情况下,媒体感知事件触发 DHCP 客户端执行操作,如试图获取租约(当发生连接事件时),或者使接口和路由无效(当发生连接断开事件时)。
2. 重新启动计算机。
注意:禁用“媒体感知”功能会带来一些副作用。例如,如果计算机上有两个网络适配器,并且启用了“媒体感知”功能,如果一个网络适配器不能正常工作,则将其取消绑定并删除关联的路由,以便通过另一个网络适配器完成所有通讯(假设此处有默认网关)。此处,如果您是漫游用户(使用便携式计算机),您可以使用“媒体感知”功能连接到任何网络上,并且可以使用所有功能,而无需重新启动、重订租约以及续约等。在禁用“媒体感知”并重新启动后,Windows 仍然在任务栏上显示“网络已断开”图标;在电缆断开连接时,“ipconfig”命令仍然显示“Media State .....:Cable Disconnected”消息。然而,网络接口绑定到了 TCP/IP,通过查看路由表即可验证这一点:可以使用“route print”命令,它显示接口 IP 地址(也可以 ping 为 NIC 分配的 IP 地址)。

posted @ 2006-09-24 09:02 javalong 阅读(1040) 评论(0) 编辑


2006年9月19日

摘要: 信息系统典型的开发架构是: MS SQLSERVER + 存储过程 +DataAccess+ DAL + Model + BLL + UI• 数据库设计 : 在建表的时候,请添加对字段的描述。这将为后来的所有自动创建注释和前台页面做好准备。(字段描述可在codeplus里进行直接录入设置)• 存储过程 :商业逻辑基本不放在这个里面,存储过程的主要作用是完成对表的基本操,包括...阅读全文

posted @ 2006-09-19 12:26 javalong 阅读(533) 评论(2) 编辑


2006年9月17日

摘要: さくら   唄~いきものがかり作詞~水野良樹作曲~水野良樹さくら ひらひら舞い降りて落ちて 揺れる想いのたけを 抱き閉めた君と春に 願いしあの夢は今も見えているよ さくら舞い散る電車から 見えたのはいつかのおもかげ 二人で通った 春の大橋卒業の時が来て 君は故郷(まち)を出た 色ずく川辺に あの日を探すのそれぞれの道を選び 二人は春を終わった 咲き誇る明日(みらい)は あたしを焦らせて小田急線の窓...阅读全文

posted @ 2006-09-17 14:44 javalong 阅读(7054) 评论(0) 编辑


2006年9月9日

摘要: ALTER DATABASE XXX MODIFY FILE (NAME = AAA, NEWNAME = BBB)阅读全文

posted @ 2006-09-09 20:46 javalong 阅读(206) 评论(0) 编辑

摘要: MDGJK-PF6YQ-PD8DJ-RFQVM-7WKWGQV9XT-CV22K-D8MGR-4MD86-8MYR6VB96B-VFG8F-74XWJ-W67Q7-8X82BM6F6D-VFQWH-CGWRB-RC7JR-VCV4WC49DP-CPHCB-MDGP3-MG334-W2V4WDR4B3-66VPQ-CK3VB-Y3BPY-2CJ2GJYCJX-CHTJX-RGH97-86WM9-RB...阅读全文

posted @ 2006-09-09 20:44 javalong 阅读(4633) 评论(0) 编辑


2006年8月8日

摘要: <script language="javascript" src="http://blog.mapbar.com/blogmap/mapjs.jsp?nid=06080808404809060671&width=190&height=303"></script>阅读全文

posted @ 2006-08-08 08:44 javalong 阅读(70) 评论(0) 编辑


posts - 42, comments - 21, trackbacks - 2, articles - 7

Copyright © javalong