发布新日志

  • 关于无线网络加密的一些概念(转)

    2009-08-27 12:39:53

    原文地址:http://blog.sina.com.cn/s/blog_4ad042e5010009fa.html~type=v5_one&label=rela_nextarticle

    关于无线网络加密的一些概念 (2007-07-29 11:17:38)
        昨天到朋友家帮忙,带着本本一起过去,想互相传一些资料,但是苦于没有大容量的闪存,也没有路由器和HUB之类的东西,甚至连网线都没有。迫使我想到了用 无线网卡互连的想法。去Google查了些资料,最后顺利的连接成功!但是其中有许多不明所以的地方,所以今天特地去找了些这方面的东西看了下。以下是我 摘录的一些自认为挺有用的信息。供对无线网络不胜了解的人扫盲之用。

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

    关于无线网络加密的一些概念

        消费者在采购无线网路设备时,一定有看过或听过WEP加密机制,产品的彩盒上也都会注明支持64128bitWEP加密(目前是面上每款产品最少都支持64位元WEP)。WEP安全协定的英文全名为wired equivalent privacy protocol,是由Wi-Fi联盟制定。

        两个802.11g无线网卡,对等网方式连接,用XP无线网络来管理,设置网络验证方式可选:开放式、共享式、WPA-None三种。其中开放式、共享式只能选WEP加密;而WPA-None加密方式可选TKIPAES两类。

    无线局域网概念介绍

    无线局域网的英文简称是WLANWirel Local Area Network),国内目前使用最多是802.11a/b/g

    频道(Channel)
    802.11g
    可兼容802.11b,二者都使用了2.4G微波频段,最多可以使用14个频道(Channel)。各国的规定的2.4G频率范围略有不 同,在中国802.11b/g可以使用1-11频道,在同一区域可以有3个互不干扰的频道。家用微波炉也在这一频率范围会对信号有影响。蓝牙也在2.4G 内,但蓝牙功率很小因此不会有大的影响。802.11a使用了5G无线频段,在同一区域可以有12个频道,一些高端的迅驰网卡支持802.11a

    带宽(bandwith)
    802.11b: 11M,5.5M,2M,1M
    802.11g: 54M,48M,36M,24M,18M,12M,9M,6M
    802.11a: 54M,20M,6M

    AP(Acess Point)
    无线接入点,是一种网络设备,无线网卡与AP相连,通过AP与其它网卡交换信号,AP通常还有RJ-45以太网口用以与有线网相连。简单地说AP就象一个Hub

    Infrastructure
    基础架构通讯方式,无线网卡通过AP进行无线通讯。

    Ad-Hoc
    一种无线网络通讯方式,各个网卡不经过AP直接进行点对点的通讯,当使用人比较少又没有AP但仍然想通过无线方式交互信息时可以用Ad-hoc方式应急。

    SSID(System Set ID)
    SSID
    用来区分不同的网络,最多可以有32个字符,如我们用的wep.net.sjtu。网卡设置了不同的SSID就可以进入不同网络,SSID通常由 AP广播出来,通过XP自带的扫描功能可以相看当前区域内的SSID。出于安全考虑可以不广播SSID,此时用户就要手工设置SSID才能进入相应的网 络。

    WEP(Wired Equivalent Privacy)有线等效保密
    为了保证数据能通过无线网络安全传输而制定的一个加密标准,使用了共享秘钥RC4加密算法,密钥长度最初为40(5个字符),后来增加到128(13个字符),有些设备可以支持152位加密。使用静态(Static)WEP加密可以设置4WEP Key,使用动态(DynamicWEP加密时,WEP Key会随时间变化而变化。

    开放式与共享式验证(open or shared Authentication)
    无线设备之间认证的模式,通常使用静态WEP加密时使用共享方式,使用802.1x动态WEP加密时使用开放认证方式。

    WPA(Wi-Fi Protected Access)
    Wi-Fi
    联盟制定的过渡性无线网络安全标准,相当于802.11i的精简版,使用了TKIP(Temporal Key Integrity Protocal)数据加密技术,虽然仍使用RC4加密算法,但使用了动态会话密钥。TKIP引入了4个新算法:48位初始化向量(IV)IV顺序规则(IV Sequencing Rules)、每包密钥构建(Per-Packet Key Construction)Michael消息完整性代码(Message Integrity Code,MIC)以及密钥重获/分发。WPA极大提高了无线网络数据传输的安全性但还没有一劳永逸地解决解决无线网络的安全性问题,因此厂商采纳的积极性似乎不高。目前Windows XP SP1可以支持WPA

    802.1x认证
    静态WEP秘钥难于管理,改变秘钥时要通知所有人,如果有一个地方泄漏了秘钥就无安全性可言,而且静态WEP加密有严重的安全漏洞,通过无线侦听在收到一 定数量的数据后就可以破解得到WEP秘钥。802.1x最初用于有线以态网的认证接入,防止非法用户使用网络,后来人们发现802.1x用以无线网可以较 好地解决无线网络的安全接入。802.1x EAP-TLS通过数字证书实现了用户与网络之间的双向认证,即可以防止非法用户使用网络,也可以防止用户连入非法的AP802.1x使用动态WEP 加密防止WEP Key被破解。为解决数字证书的发放难题人们对TLS认证进行了改进产生了TTLSPEAP,可以用传统的用户名口令方式认证入网。我校无线网络的 802.1x可以同时支持EAP-TLSTTLSPEAP

    WAPI(WLAN Authentication and Privacy Infrastructure)无线局域网认证与保密基础架构
    中国提出的一个无线网络通讯的安全标准,国标代号GB15629.11

    Wi-Fi
    Wi-Fi联盟(Wi-Fi Alliance)的标记,参看[url]http://www.wi-fi.org[/url]Wi-Fi联盟是1999年成立的非盈利性的国际组织,致力于基于802.11的无线网络产品的互通性认证。目前拥有200家会员单位。

    ?WPA-PSK—Enables WPA Pre-shared key (WPA-PSK), which enables your client adapter to associate to access points using WPA-PSK.

    ?WPA-None—Enables WPA for your client adapter when the client is set for ad hoc mode.

    wpa-none用于对等网(ad-hoc),wpa-psk用于接入点连接。

    区别:
    WPA supports two mutually exclusive key management types: WPA and WPA-Pre-shared key (WPA-PSK). Using WPA key management, clients and the authentication server authenticate to each other using an EAP authentication method, and the client and server generate a pairwise master key (PMK). Using WPA, the server generates the PMK dynamically and passes it to the access point. Using WPA-PSK, however, you configure a pre-shared key on both the client and the access point, and that pre-shared key is used as the PMK.

    加密强度:
    WPA-AES using a radius server is better security since you then don't use a pre shared key.
    But for most home users, setting up a radius server is not an option.
    WPA-PSK with a pre shared key more than ~20 characters should be more secure than WEP.
    preferebly using AES.
    With WPA in infrastructure mode, the AP will provide you the key to encrypt/decrypt data, you can also on most AP set the timout interval when to renew the key.
    With WPA-None, there is no 802.1x authenction, the key used to encrypt /decrypt is just a hash of the SSID and the password.
    To me using WPA-None / TKIP isn't much better than WEP. (since both encrypt/decrypt using RC4 and the key is static)
    Using WPA-None and AES should increase the security but still the key is static.

    wpa是包含802.1x认证的,wpa-none则取消了这个功能。。。。


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

    配置无线网络:
    Dell
    无线 1450 USB 适配器使用指南
    Dell WLAN
    配置实用程序允许您通过无线网络菜单配置与无线网络进行通信时的参数。本节包含以下主题:

     无线网络菜单
     
    网络配置
     
    关联选项卡
     
    身份验证选项卡

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

    无线网络菜单
     

     备注:如果计算机运行 Windows XP 操作系统并启用了无线零配置服务,则无线连接配置由该服务所控制。若需使用 Dell WLAN 配置实用程序配置无线通信,则须禁用该服务。

    可用网络:此菜单的第一部分用于显示可用无线网络的列表。如果与某一网络有关联,则在此列表及首选网络列表中该网络的图标上均会出现一个蓝色气泡。

    该列表右侧的配置按钮可用来配置与突出显示的网络之间的连接;有关此过程的解释,请参阅网络配置。刷新按钮可强制配置实用程序扫描可用的网络,以便更新列表。

    首选网络:此菜单的第二部分显示首选网络列表。该列表从上到下显示计算机试图连接的网络的顺序。如果计算机连接到其中某一网络,则该网络的图标上将出现一个蓝色气泡。如果计算机执行扫描时无法找到任何网络,该网络的图标上将出现一个带叉号的红色气泡。

    当计算机开始搜索无线网络时,它首先试图连接到该列表中的第一个网络。如果无法连接到该网络,则尝试连接到列表中的第二个网络。此过程会一直持续到计算机与其中一个网络建立起连接。

    突出显示该列表中的某一网络并单击上移或下移按钮,即可改变首选网络的顺序。

    使用添加按钮可将新网络添加到该首选网络列表中。属性按钮用于配置选中的网络。有关这些按钮操作的详细解释,请参阅网络配置。使用删除按钮可将选中的网络从首选网络列表中删除。

    首选网络部分下面有两个条目。在系统栏中显示无线配置图标字段用来确定是否在桌面右下角的系统栏中显示 Dell WLAN 配置实用程序的图标。如果不选中该字段,可从开始菜单启动配置实用程序。方法是:选择程序 →Dell Wireless → Dell USB 无线网卡实用程序。

    无线网络菜单底部有三个按钮。单击确定按钮可将在该菜单或配置实用程序的任何其他 菜单中所做的更改应用到系统,并关闭该实用程序。单击取消按钮可取消上一次单击应用按钮之后所做的任何更改,但不关闭实用程序。单击应用按钮可保存在该菜 单或配置实用程序的任何其他菜单中所做的更改,但不关闭实用程序。


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

    网络配置
    Dell WLAN
    配置实用程序中有三种配置网络的方法:

    选择可用网络列表中的某一网络,然后单击配置按钮。
     
    选择首选网络列表中的某一网络,然后单击属性按钮。
     
    单击首选网络列表底下的添加按钮。
    单击任意一个按钮,都会在屏幕上弹出类似于下面的窗口:


    如果单击配置或属性按钮,单击按钮时突出显示的网络名称将显示在网络名称(SSID)字段中。如果是单击添加按钮显示的该菜单,则该字段为空。要将网络添加到首选网络列表中,请在该字段输入其名称。

    该菜单底部将显示两个按钮。单击确定按钮可应用在该菜单以及配置实用程序的任何其他菜单中所做的更改。单击取消按钮可取消上一次单击应用按钮之后所做的任何更改。单击这两个按钮中的任意一个都将返回到无线网络菜单。

    网络配置过程包括指定关联和身份验证的值,详细说明请见下面各节。

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

    关联选项卡
    关联是指连接到网络(基础结构或 adhoc)的能力。与网络相关联的最基本要求是要为网络指定正确的名称,或服务集标识符(SSID)。

    接入时,各网络对身份验证和加密也可能有一定的要求。身份验证是网络用来确定您是否有入网授权的一种方法。加密则是用来遮掩网上传输数据的一种方法。

    如果您正在配置的网络属于这种情况,就必须在该菜单的无线网络密钥部分输入所用网络使用的身份验证和加密类型。要选择这些字段的值,请单击相应字段右侧的向下箭头,然后突出显示下拉列表中的某一值。


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

    身份验证
    验证共有六个类型:

    开放式身份验证
    共享式身份验证
    WPA
    身份验证
    WPA-PSK
    身份验证
    WPA2
    身份验证
    WPA2-PSK
    身份验证
    若需使用 WPA-PSK,WPA2-PSK 身份验证,您必须单击该字段旁边的属性按钮,并输入一个共享的密钥。

    键入的字母数字个数可在 8 63 之间,或不多不少键入 64 个十六进制字符。

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

    加密
    开放式和共享式验证方法可使用 WEP(有线等效隐私)加密途径遮掩传输的数据。若需为网络启用 WEP 加密方法,您必须输入 WEP 密钥,具体操作方法是:单击加密类型字段旁边的属性按钮。

    单击此按钮后,配置实用程序将选择手动输入密钥,并允许您以字母数字或十六进制字符输入密钥。要输入密钥,请单击四个 WEP 密钥字段中的任意一个,然后开始键入。对于 64 位加密,必须在这些密钥字段中正确键入 5 位字母数字或 10 个十六进制字符;而对于 128 位加密,必须不多不少地键入 13 位字母数字或 26 个十六进制字符。然后单击确定按钮以创建密钥。单击确定按钮后,配置实用程序将使用星号遮掩此密钥。

    全局密钥(默认值)字段允许您在四个加密密钥中指定一个要用于在无线局域网中传输数据的密钥。要更改默认密钥,可单击该字段右侧的上下箭头,直到出现想要使用的密钥编号。只要正在通信的接入点或计算机在同一位置具有相同的密钥,就可将任意密钥作为默认值。

    要使用密码短语创建密钥,请单击输入密码短语旁边的单选按钮,并在密码短语字段中键入字符串。与手动创建密钥一样,您必须正确地键入 5 个字母数字或 10 位十六进制字符用于 64 位加密,而对于 128 位加密,则必须正确地输入 13 个字母数字或 26 位十六进制字符。单击确定按钮后,配置实用程序将生成 4 WEP 密钥,并使用星号遮掩这些密钥。

    WPA WPA2 验证而言,您可指定 CKIPTKIP AES 加密。若需指定 EAP 方法,请选取验证选项卡.

    WPA-PSK WPA2-PSK 验证而言,您可指定 TKIP AES 加密

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

    关联菜单底部有两个字段。如果选中了第一个字段(单击该字段左侧的复选框),假如由 AP 使用的网络名称与该菜单中指定的网络名称相匹配,则您的计算机可与不支持加密的接入点进行关联。

    如果您配置的网络是一个 ad-hoc 网络,则须选中关联菜单底部的第二个字段。如果要添加一个 adhoc 网络,请单击该字段旁边的复选框。选中该字段后,单击Ad-hoc 信道字段右侧的下拉箭头并突出显示相应的信道,即可指定在 ad-hoc 网络中使用的信道。

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

    身份验证选项卡
    如果配置的网络有身份验证方面的要求,可选取身份验证选项卡,以便继续配置。选取此选项卡后,屏幕上将显示一个类似于下列的菜单:

    要启用身份验证,请单击对该网络启用 IEEE 802.1x 身份验证字段旁边的复选框。此举将激活其他字段,以便指定身份验证参数。

    该菜单中的第一个字段允许您指定网络所用的可扩展身份验证协议 (EAP) 的类型。要选择一个类型,请单击该字段右侧的下拉箭头,从显示的列表中选择其中一个类型。

    该字段下面还有三个字段,用以指定其他身份验证方法的参数。若需启用这些参数的任何一个,可单击相关字段旁边的复选框。

    EAP 方法请求用户名/密码时,始终给与提示复选框(若已启用),将显示一个对话框,要求您输入用户名和密码,即使在该配置文件中业已配置,亦不例外。此选项与后面的选项不兼容。

    此乃公用配置文件,本系统上的所有用户都可使用复选框可使其成为全系统的配置文件。在所用计算机开机时,它首先搜索系统配置文件,如果找到一个配置文件,计算机将尝试用之与无线网络连接(这项作业甚至在用户登录到 Windows 之前就已开始)。如果是公用配置文件,所用计算机还会在您注销 Windows 后仍然保留与无线网络的连接,以便另一用户登录。这一选项与当 EAP 方法请求用户名/密码时,始终给与提示选项不兼容。

    对于公共配置文件,您可通过使用系统客户端证书字段指定,计算机本身 (不论何人登录到该计算机) 必须提交一份可在网上验证的证书。当您启用了这一字段后,您必须在下列证书字段中选择一个证书。

    如果已安装了网域预登录功能,屏幕上则会显示网域帐户的无线验证功能已启用状态讯息,否则将会显示网域帐户的无线验证功能已停用。有关详情,请见网域预登录功能的安装与卸载.

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

    选择好 EAP 类型后,请单击属性按钮以指定身份验证所需要的信息。下面几个部分说明了每个可用 EAP 类型的配置。

    PEAP 身份验证
     
    TLS
    身份验证
     
    EAP - Cisco
    无线 (LEAP) 身份验证
     
    MD5
    质询身份验证
     
    TTLS
    身份验证

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

    PEAP 身份验证
    单击 PEAP 身份验证的属性按钮时,屏幕上会显示如下菜单:

    PEAP 需要用户名和服务器名称;请在屏幕的相应字段内输入这些信息。使用 PEAP 可以与服务器一起使用一个用于身份验证的客户端证书,方法是:单击使用客户端证书字段旁边的复选框,突出显示列表中的证书并选中它。

    若单击验证服务器证书字段旁边的复选框,则可指定身份验证服务器必须首先正确地标识自身,然后方可开始验证任何客户端。

    单击允许中间证书授权字段旁边的选择框,即可从已由在服务器名称字段中命名的服务器授权的、用以提供身份验证服务的身份验证服务器中接收证书凭据。单击允许子域字段旁边的复选框,即可从网络的任意子域中已通过授权的服务器上接收证书。

    隧道身份验证需要用户名和密码(您可在此菜单的适当字段内输入)。您也可使用您的 Windows 用户名和密码进行隧道身份验证,方法是:选中自动使用我的 Windows 登录名和密码(包括域,如果可用的话)旁边的复选框。

    隧道身份验证还需要使用一种身份验证方法。选择身份验证方法时,单击身份验证字段旁边的下拉箭头,然后在显示的列表中单击您想使用的方法。

    要保存在本菜单中输入的信息,请单击确定按钮。要放弃对本信息所做的更改,请单击取消按钮。单击这两个按钮中的任意一个都将返回到无线网络属性菜单。


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

    TLS 身份验证
    单击 TLS 身份验证的属性按钮后,屏幕上将显示如下菜单:

    TLS 身份验证需要用户名和服务器名称;请在屏幕的相应字段输入这些信息。使用 TLS 身份验证,就可以与服务器一起使用一个用于身份验证的客户端证书,方法是:单击使用客户端证书字段旁边的复选框,突出显示列表中的证书并选中它。智能卡上的证书必须位于智能卡的公用区域。

    若单击验证服务器证书 旁边的字段,则可指定身份验证服务器必须首先正确地标识自身,然后方可开始验证任何客户端。

    单击允许中间证书授权字段旁边的选择框,即可从任何已由在服务器名称字段中命名的服务器授权过的、用以提供身份验证的身份验证服务器中接收证书凭证。单击允许子域字段旁边的复选框,即可从网络的任意子域中已通过授权的服务器上接收证书。

    要保存在本菜单中输入的信息,请单击确定按钮。要放弃对本信息所做的更改,请单击取消按钮。单击这两个按钮中的任意一个都将返回到无线网络属性菜单。


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

    EAP - Cisco 无线 (LEAP) 身份验证
    单击 LEAP 身份验证的属性按钮后,屏幕上将显示如下菜单:


    LEAP 需要用户名和服务器名称;请在屏幕的相应字段输入这些信息。您也可使用您的 Windows 用户名和密码,方法是:选中自动使用我的 Windows 登录名和密码(包括域,如果可用的话)旁边的复选框。

    还可以启用 CCXCisco 兼容扩展)与 LEAP 安全功能一起使用。网络 EAP 使用的是网络上的身份验证服务器。要使用该功能,请单击使用网络 EAP旁边的复选框。

    CCX 还提供一种方法,可避免与未经授权的接入点进行关联。要启用该功能,请单击启用欺诈 AP 检测旁边的复选框。启用该功能后,还可以在 AP 身份验证失败时更改身份验证凭据(方法是:单击允许失败时更改凭证字段旁边的复选框),也可以设置此身份验证的超时时间值(方法是:单击超时字段右侧的上下箭头)。

    要保存在本菜单中输入的信息,请单击确定按钮。要放弃对本信息所做的更改,请单击取消按钮。单击这两个按钮中的任意一个都将返回到无线网络属性菜单。


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

    MD5 质询身份验证
    单击 MD5 质询身份验证的属性按钮后,屏幕上将显示如下菜单:

    MD5 质询身份验证法只需要用户名和密码;请在所用屏幕的适当字段内输入此信息。您也可使用您的 Windows 用户名和密码进行 MD5 质询身份验证,方法是:选中自动使用我的 Windows 登录名和密码(包括域,如果可用的话)旁边的复选框。

    要保存在本菜单中输入的信息,请单击确定按钮。要放弃对本信息所做的更改,请单击取消按钮。单击这两个按钮中的任意一个都将返回到无线网络属性菜单。


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

    TTLS 身份验证
    单击 TTLS(隧道传输层安全协议)身份验证的属性按钮后,屏幕上将显示如下菜单:

    TTLS 需要用户名和服务器名称;请在屏幕上相应的字段内输入这些信息。使用 TTLS 可以与服务器一起使用一个用于身份验证的客户端证书,方法是:单击使用客户端证书字段旁边的复选框,突出显示列表中的证书并选中它。

    若单击验证服务器证书字段旁边的复选框,则可指定身份验证服务器必须首先正确地标识自身,然后方可开始验证任何客户端。

    单击允许中间证书授权字段旁边的选择框,即可从任何已由在服务器名称字段中命名的服务器授权过的、用以提供身份验证的身份验证服务器中接收证书凭证。单击允许子域字段旁边的复选框,即可从网络的任意子域中已通过授权的服务器上接收证书。

    隧道身份验证需要用户名和密码(您可在此菜单的适当字段内输入)。您也可使用您的 Windows 用户名和密码进行隧道身份验证,方法是:选中自动使用我的 Windows 登录名和密码(包括域,如果可用的话)旁边的复选框。

    隧道身份验证还需要使用一种身份验证方法。选择身份验证方法时,单击身份验证字段旁边的下拉箭头,然后在显示的列表中单击您想使用的方法。

    要保存在本菜单中输入的信息,请单击确定按钮。要放弃对本信息所做的更改,请单击取消按钮。单击这两个按钮中的任意一个都将返回到无线网络属性菜单。

     

  • C语言练习

    2009-08-18 13:06:28

    练习1
     题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
    1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去
           掉不满足条件的排列。
    2.程序源代码:
    main()
    {
    int i,j,k;
    printf("\n");
    for(i=1;i<5;i++)    /*以下为三重循环*/
      for(j=1;j<5;j++) 
       for (k=1;k<5;k++)
        {
         if (i!=k&&i!=j&&j!=k)    /*确保i、j、k三位互不相同*/
         printf("%d,%d,%d\n",i,j,k);
        }
    }

     


    练习2
    题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
        于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提
        成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
        40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
        100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
    1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。      
    2.程序源代码:
    main()
    {
    long int i;
    int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
    scanf("%ld",&i);
    bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
    bonus4=bonus2+200000*0.5;
    bonus6=bonus4+200000*0.3;
    bonus10=bonus6+400000*0.15;
      if(i<=100000)
       bonus=i*0.1;
      else if(i<=200000)
          bonus=bonus1+(i-100000)*0.075;
         else if(i<=400000)
             bonus=bonus2+(i-200000)*0.05;
            else if(i<=600000)
                bonus=bonus4+(i-400000)*0.03;
               else if(i<=1000000)
                   bonus=bonus6+(i-600000)*0.015;
                  else
                   bonus=bonus10+(i-1000000)*0.01;
    printf("bonus=%d",bonus);
    }


    练习3
    题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
    1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
           的结果满足如下条件,即是结果。请看具体分析:
    2.程序源代码:
    #include "math.h"
    main()
    {
    long int i,x,y,z;
    i=0;
    for (i=1;i<100000;i++)
      { x=sqrt(i+100);   /*x为加上100后开方后的结果*/
       y=sqrt(i+268);   /*y为再加上168后开方后的结果*/
        if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
         printf("\n%ld\n",i);
      }
    }

    练习4
    题目:输入某年某月某日,判断这一天是这一年的第几天?
    1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊
           情况,闰年且输入月份大于3时需考虑多加一天。
    2.程序源代码:
    main()
    {
    int day,month,year,sum,leap;
    printf("\nplease input year,month,day\n");
    scanf("%d,%d,%d",&year,&month,&day);
    switch(month)/*先计算某月以前月份的总天数*/
    {
      case 1:sum=0;break;
      case 2:sum=31;break;
      case 3:sum=59;break;
      case 4:sum=90;break;
      case 5:sum=120;break;
      case 6:sum=151;break;
      case 7:sum=181;break;
      case 8:sum=212;break;
      case 9:sum=243;break;
      case 10:sum=273;break;
      case 11:sum=304;break;
      case 12:sum=334;break;
      default:printf("data error");break;
    }
    sum=sum+day;  /*再加上某天的天数*/
      if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
       leap=1;
      else
       leap=0;
    if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/
    sum++;
    printf("It is the %dth day.",sum);}

    练习5
    题目:输入三个整数x,y,z,请把这三个数由小到大输出。
    1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,
           然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
    2.程序源代码:
    main()
    {
    int x,y,z,t;
    scanf("%d%d%d",&x,&y,&z);
    if (x>y)
    {t=x;x=y;y=t;} /*交换x,y的值*/
    if(x>z)
    {t=z;z=x;x=t;}/*交换x,z的值*/
    if(y>z)
    {t=y;y=z;z=t;}/*交换z,y的值*/
    printf("small to big: %d %d %d\n",x,y,z);
    }

    练习6
    题目:输出9*9口诀。
    1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
    2.程序源代码:
    main()
    {
        int i,j,result;
        printf("\n");
        for(i=1;i<10;i++)
        {
          for(j=1;j<=i;j++)
            {
                result=i*j;
                printf("%d*%d=%-3d",j,i,result);   /*-3d表示左对齐,占3位*/
            }
            printf("\n");   /*每一行后换行*/
        }
    或者
    main()
    {
        int i,j,result;
        printf("\n");
        for(i=1;i<10;i++)
        {
            for(j=1;j<10;j++)
            {
                result=i*j;
                printf("%d*%d=%-3d",j,i,result);
            }
            printf("\n");
        }

    练习7
    题目:要求输出国际象棋棋盘。
    1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
    2.程序源代码:
    #include "stdio.h"
    main()
    {
    int i,j;
    for(i=0;i<8;i++)
      {
       for(j=0;j<8;j++)
        if((i+j)%2==0)
         printf("%c%c",219,219);
        else
         printf(" ");
        printf("\n");
      }
    }

    练习8
    题目:打印楼梯,同时在楼梯上方打印两个笑脸。
    1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。
    2.程序源代码:
    #include "stdio.h"
    main()
    {
    int i,j;
    printf("\1\1\n");/*输出两个笑脸*/
    for(i=1;i<11;i++)
      {
      for(j=1;j<=i;j++)
       printf("%c%c",219,219);
      printf("\n");
      }
    }

    练习9
    题目:2的N次方。
    2.程序源代码:
    #include"stdio.h"
    main()
    {
        long int i,x,m;
        x=1;
        for(i=1;i<10;i++)
        {
            x=2*x;
            printf("%d\n",x);
        }
    }

    练习10
    题目:判断101-200之间有多少个素数,并输出所有素数。

        程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

    程序源代码:
    #include "math.h"
    main()
    {
     int m,i,k,h=0,leap=1;
     printf("\n");
     for(m=101;m<=200;m++)
      { k=sqrt(m+1);
       for(i=2;i<=k;i++)
         if(m%i==0)
          {leap=0;break;}
       if(leap) {printf("%-4d",m);h++;
            if(h%10==0)
            printf("\n");
            }
       leap=1;
      }
     printf("\nThe total is %d",h);
    }

    练习11
    题目:输入三角形的三边长,求三角形面积。
    程序分析:三角形面积格式:area=s(s-a)(s-b)(s-c)的平方根。
    程序源代码
    #include"math.h"
    main()
    {
    float a,b,c,s,area;
    scanf("%f,%f,%f",&a,&b,&c);
    s=1.0/2*(a+b+c);
    area=sqrt(s*(s-a)*(s-b)*(s-c));
    printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n",a,b,c,s);
           printf("area=%7.2f\n",area);
    }

    练习12
    题目:从键盘输入一个大写字母,要求改用小写字母输出。
    程序源代码
    #include"stdio.h"
    main()
    {
        char c1,c2;
        c1=getchar();
        printf("%c,%d\n",c1,c1);
        c2=c1+32;
        printf("%c,%d\n",c2,c2);
    }

    练习13
    题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

        程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

    程序源代码:
    #include"stdio.h"
    main()
    {
        int n,i,j,k,n2;
        scanf("%d",&n2);
        for(n=100;n<n2;n++)
        {
        i=n/100;
        j=n/10%10;
        k=n%10;
        if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
        {
        printf("%3d %3d %3d\n",i,j,k);
        }
    }
    }

    练习14
    题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

        程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
     (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
     (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
     (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

    程序源代码:
    #include"stdio.h"
    main()
    {
        int n,i;
        printf("\nplease input a number:\n");
        scanf("%d",&n);
        printf("%d=",n);
        for(i=2;i<n;i++)
        {
            while(n!=i)
            {
                if(n%i==0)
                {
                    printf("%d*",i);
                    n=n/i;
                }
                else
                    break;
            }
        }
        printf("%d",n);
    }

    练习15
    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
    程序分析:这是个Fibonacci数列40个数,这个数列有如下特点:第1,2两个数为1,1.从第3个数开始,该数是其前面两个数之和。
    源代码:
    #include<stdio.h>
    main()
    {
        long int f1,f2;
        int i;
        f1=1;f2=1;
        for(i=1;i<=20;i++)
        {
            printf("%12ld%12ld",f1,f2);
            if(i%2==0) printf("\n");
            f1=f1+f2;
            f2=f2+f1;
        }
    }


    #include<stdio.h>
    main()
    {
        int i;
        int f[20]={1,1};
        for(i=2;i<20;i++)
            f[i]=f[i-2]+f[i-1];
        for(i=0;i<20;i++)
        {
            if(i%5==0) printf("\n");
            printf("%12ld",f[i]);
        }
        printf("\n");
    }

    练习16
    求n的阶乘(n!)
    分析:用函数递归方法解;
    源程序
    #include <stdio.h>

    float fac(int n)
    {
        float f;
        if(n<0) f=0;
        else if(n==0 || n==1) f=1;
        else f=fac(n-1)*n;
        return(f);
    }

    main()
    {
        int n;
        float y;
        printf("input a integer number:");
        scanf("%d",&n);
        y=fac(n);
        if (y==0) printf("n<0,dataerror!");
        else printf("%d! =%15.0f",n,y);
    }


  • bash脚本中的注释符号

    2009-08-13 13:15:56

    bash脚本中,
    #是一行的注释符号

    : <<!EOF!
    comment line1
    comment line2
    .
    .
    .
    comment linen
    !EOF!
    N行注释方法

    foo(){
    command
    .
    .
    .
    .
    .
    command
    }
    N行注释,是利用空语句
  • C++创建文本文件

    2009-08-09 15:05:11

    #include <stdio.h>
    #include<direct.h>
    void main()
    {
        FILE * fp;
       int i;
       for(i = 1;i < 5; i++)
       {       char name[128];
           sprintf(name, "D:\\1\\wenjian%d.txt", i);
            
            fp    = fopen(name, "w");
            fclose(fp);
       }
        system("pause");
    }
  • While语句实例

    2009-08-09 13:44:32

    #循环执行,到10停止
    #!/bin/sh
    count=1
    while [ $count -ne 10 ]
    do
    echo  "The copy count is" $count
    mkdir $count
    cp -r Media $count
    count=$(( $count + 1 ))
    done

  • 移动硬盘上的控制芯片介绍

    2009-07-18 19:44:44

    移动硬盘上的控制芯片决定着移动硬盘的传输性能和稳定性。
    高端芯片:赛普拉斯、NEC、旺玖;
    低端芯片:安国、扬智、创惟;
  • 怎样在VS2005里开发C语言项目

    2009-05-30 21:14:49

    1,  打开vs2008,选择C++语言,创建一个空项目,见图1、2、3;

    2,  进去后,选中源文件文件夹——>工程——>新建项,或右击源文件文件夹——>添加——>新建项,见图4;


    3,  在弹出的“添加新项”界面的右边选择“C++文件”或者“文本文件”——>在下面的名字框里填上文件的名称例如“name.c”,注意,一定要有后缀名.C  。然后就可以编辑调试啦!见图5;

    4,   写一个Hello World,加一句system("pause");用来让它显示结果,不至于一闪而过。

    5,  按F7-->F5,效果,见图6;
  • 转VS2005调试技巧

    2009-05-30 21:12:39

    下面有从浅入深的6个问题,您可以尝试回答一下

    1. 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么在j=5前面插入断点
    2. 在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能做到呢?
    3. 你有一个表达式在上面循环的某一次发生了变化,你想知道是哪一次,在哪个地方,怎么才能做到?
    4. 你希望你的断点在被命中100次后,每命中三次中断一次,比如第103,第106,第109怎样做?
    5. 你有在调试一个服务程序,希望在其内部打上了断点,可是,由于这是一个公用的服务你不希望其他访问这个服务的程序被你的调试所干扰,你想怎么办?
    6. 怎样知道2个断点中断的时间间隔

    问题1,2

    这两个问题最简单,我在一个例子里说明

    例如如下循环

    for(int i=0;i<1000;i++){doSomeThing......}

    在循环的大括号上单击右键,插入断点,用这个方法,可以对付那些喜欢把语句写在一行上的家伙,其实,随着.Net3.5中Linq的出现,我们肯定也会经常在在一行上写复杂的表达式,这个时候用这种插入方法会比较管用

    ok,现在我们来编辑这个断点的条件,在断点上右键单击,选择如图菜单项

    在弹出的窗口中可以设置断点命中的条件i==900

    注意我是在调试C#代码,默认的条件语句语法是C#,如果你想切换,那就需要用Ctrl-B,来插入断点,并在弹出窗口中选择语言

    通过这样设置条件断点,我们就可以解决我们的问题1,2了

    问题3

    同样通过设置条件断点我们还可以解决我们的问题3,对表达式变化的跟踪

    string user="yizhu2000"

    for(int i=0;i<10000;i++){

    DoSomething1()

    .......

    DoSomethingN()

    }

    当循环执行完毕时我们发现user变成了"smart_boy",你不知道这个值是在第几次循环的时候变化的,那么你是不是会选择打上断点,一次一次中断,来查看呢?当然不用

    在循环体结束的位置我们设置一个断点,打开条件编辑窗口(打开方法同上),设置表达式为user,勾选下面的HasChanged,也就是说,你告诉断点,当user的值发生变化时才触发

    (注意:第一次执行到断点的时候,程序一定会中断,并计算这时表达式的值,所以,所谓发生变化,指的是以后执行到断点是表达式的值和第一次执行到断点时表达式的值的比较)

    问题4

    如何让断点在指定的命中次数或者大于某个次数时触发呢?方法是设定几个断点的HitCount,右键单击断点,在弹出菜单中选择Hit Count,会弹出如下窗口

    在"when the break point is hit"下拉列表里,我们可以看到四个选项

    break always:总是中断

    break when the hit count is equal to:等于某次数时中断

    beak when the hit count is a multpile of:当次数是某数的倍数时中断

    break when the hit count is greater than or equal to:当大于等于某数时中断

    问题5

    前面4个问题都已经解决了,第5个问题的解决方法是利用断点的Filter功能,比如我希望断点只有被机器名为yizhu的机器访问才能触发,我可以这样设置

    当其他机器访问程序的时候,断点将不会触发,这样做的优点是通过设置机器名,我们可以让其他机器访问的时候感觉不到断点的存在,除此之外我们可以设 置机器名,进程号,进程名,线程号,线程名作为filter,而且还可以把他们组合起来,比如我希望通过当机器yizhu的dllhost进程调用时才触 发,那么问题就可以设置为MachineName="yizhu"&ProcessName="dllhost"

    问题6

    现在我们来解决第6个问题:

    在程序性能调试的时候,我们经常需要知道某段代码的执行效率,一般来说,我们可以在程序中加入时间点,通过时间点相减来取得时间间隔,这种方法有个 显而易见的缺点就是需要修改程序,想要不修改程序,就需要借助一些工具,那么有没有什么方法可以声明式的插入时间点,并计算值呢?其实断点完全可以做到

    在给出方法前,我们来看看断点的另外一个设置项,When Hit,这个选项可以让我们在命中断点后做一些事情,包括输出一些内容,或者调用宏,比如输出一个程序中变量的值

    我们输出了变量user的值,下面Continue Execution表示程序不会中断,输出后继续执行,注意表达式需要用{}括起来,,其他的部分会被作为字符串输出。设定WhenHit后断点变成了方形(看厌了圆断点,我还挺喜欢这个方家伙的)

    在output中查看输出结果,如下:

    既然可以计算表达式,我们的第一个最简方案就出来了,也就是在程序执行到断点的时候,输出DateTime.Now,这样当然是可行的,但是我们需 要的是时间间隔,所以我们还需要自己来算个减法,还是挺麻烦的,怎么样才能让程序自己输出时间间隔呢?有一个想法是这样的,我们在上一个断点声明一个时间 变量,然后在下面的断点里用DataTime.Now减去这个变量,即

    断点一的条件:{DateTime _t=DateTime.Now;}

    断点二的条件:{DateTime.Now-t;}

    看起来不错,但是实际运行时就有问题了,让我们看看输出吧

    上面高亮的部分说,变量申明只能在immediate window中进行,所以断点一的变量没有申明成功,关于immediatewindow,我们以后会涉猎到,反正就是说想在表达式里申明变量,没门,死路一条.那么我们怎么才能不申明变量又时间点呢?

    这时我想起了Thread.SetData 方法,这个方法可以往当前线程专门提供的空间中插入一些数据,并且可以通过GetData得到数据,具体细节参考

    http://msdn2.microsoft.com/zh-cn/library/system.threading.thread.setdata(VS.80).aspx

    于是方案就有了,在第一个断点处把时间放入Thread的DataSlot,然后第二个断点取出来相减

    断点一的条件:{Thread.SetData(Thread.GetNamedDataSlot("ExecutionTime"),DateTime.Now);}

    断点二的条件:{DateTime.Now-(DateTime)System.Threading.Thread.GetData(System.Threading.Thread.GetNamedDataSlot("ExecutionTime"));}

    看看输出效果

    我们的目的已经达到了,output中成功的输出了时间间隔,当然,还不是很完善,首先,这个方法限于两个断点,你想多打几个断点,测试两两间的间隔还是比较麻烦.测量精度也可以提高,大家有兴趣可以自己研究这个方法的扩展

  • 转:关于Microsoft.XMLHttp的属性和方法的简介及使用

    2009-05-19 15:29:06

    Microsoft.XMLHttp组件的属性方法
    一、使用步骤:
    1、创建XMLHTTP对象 //需MSXML4.0支持
    2、打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等。客户端通过Open命令打开与服务端的服务网页的连接。与普
    通HTTP指令传送一样,可以用"GET"方法或"POST"方法指向服务端的服务网页。
    3、发送指令。
    4、等待并接收服务端返回的处理结果。
    5、释放XMLHTTP对象

    二、XMLHTTP方法:
    Open( bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword )
    bstrMethod: 数据传送方式,即GET或POST。
    bstrUrl: 服务网页的URL。
    varAsync: 是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。
    bstrUser: 用户名,可省略。
    bstrPassword:用户口令,可省略。

    Send( varBody )
    varBody:指令集。可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。也可以省略,让指令通过Open方法的URL参数代入。

    setRequestHeader( bstrHeader, bstrvalue )
    bstrHeader:HTTP 头(header)
    bstrvalue: HTTP 头(header)的值
    如果Open方法定义为POST,可以定义表单方式上传:
    xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded")

    三、XMLHTTP属性:
    onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
    responseBody: 结果返回为无符号整数数组。
    responseStream: 结果返回为IStream流。
    responseText : 结果返回为字符串。
    responseXML: 结果返回为XML格式数据。
    具体的使用方法
    创建XMLHTTP对象的语句如下:


    Set bjXML = CreateObject("Msxml2.XMLHTTP") 或
    Set bjXML = CreateObject("Microsoft.XMLHTTP")
    'Or for version 3.0 of XMLHTTP, use:
    'Set bjXML = Server.CreateObject("MSXML2.ServerXMLHTTP")

    对象创建后调用Open方法对Request对象进行初始化,语法格式为:


    objXML.open http-method,url,async,userID,password


    Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示:

    http-method:HTTP的通信方式,比如GET或是POST
    url:接收XML数据的服务器的URL地址。通常在URL中要指明ASP或CGI程序
    async:一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作
    userID:用户ID,用于服务器身份验证
    password:用户密码,用于服务器身份验证

    XMLHTTP对象的Send方法

    用Open方法对Request对象进行初始化后,调用Send方法发送XML数据:


    objXML.send()

    Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。

    发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。

    XMLHTTP对象中的readyState属性

    其能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:


    值  说明
    0   Response对象已经创建,但XML文档上载过程尚未结束
    1   XML文档已经装载完毕
    2   XML文档已经装载完毕,正在处理中
    3   部分XML文档已经解析
    4   文档已经解析完毕,客户端可以接受返回消息


    客户机处理响应信息,客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。

    客户机接收响应是通过XMLHTTP对象的属性实现的:

    responseText:将返回消息作为文本字符串;
    responseBody:将返回消息作为HTML文档内容;
    responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用;
    responseStream:将返回消息视为Stream对象

    以下是一个简单的例子:类似新闻小偷


    <%
    Set bjXML = Server.CreateObject("MSXML2.ServerXMLHTTP")
    objXML.open "GET","http://www.alexa.com",false
    objXML.send()
    response.write(objXML.responseText)
    %>


    整个步骤很明显:建立、打开、发送和接受。

    实例:获取网页信息

    Set bjXML = CreateObject("Microsoft.XMLHTTP")
    'objXML.open "GET","http://10.0.0.144/goform/formNasSambaSave",False, "admin","1234"
    objXML.open "GET","http://10.0.0.144/nassetting.asp",False, "admin","1234"  '使用时,要修改网址,用户名,密码
    objXML.send()
    a = objXML.readyState  '判断连接状态,可以不要
    'MsgBox a   
    b = objXML.responseText  '获取WEB Server返回的信息
    'MsgBox b

    Const ForAppending = 8
    Set bjFSO = CreateObject("Scripting.FileSystemObject")
    Set fs=objFSO.OpenTextFile("D:\test.htm",ForAppending,True, -1)  '把WEB Server返回的信息写入文件

    fs.WriteBlankLines(3)
    fs.Write b
    fs.Close()
    Set fs=nothing
    Set bjFSO=nothing

    实例:向WEB Server发送信息
    Dim a,b,t

    t = Now()

    '获取日期
    dtmThisMinute = Minute(time)
    dtmThisHour = Hour(Time)
    dtmThisDay = Day(Date)
    dtmThisMonth = Month(Date)
    dtmThisYear = Year(Date)
    tmToday = dtmThisMonth & "/" & dtmThisDay & "/" & dtmThisYear
    Logfile = dtmThisYear & "Year" & dtmThisMonth & "Month" & dtmThisDay & "Day" & dtmThisHour & "Hour" & dtmThisMinute & "Minute"


    Set bjXML = CreateObject("Microsoft.XMLHTTP")
    objXML.open "GET","http://10.0.0.144/goform/formNasSambaSave?smbName=tomtom2&smbGroup=gjmhome&smbDescrip=This is gjm storage server.&recycled=1",False, "admin","1234"  '使用时,要修改网址,用户名,密码,和你要发生的信息
    objXML.send()
    a = objXML.readyState
    'MsgBox a
    b = objXML.responseText
    'MsgBox b

    Const ForAppending = 8
    Set bjFSO = CreateObject("Scripting.FileSystemObject")
    Set fs=objFSO.OpenTextFile("D:\" & Logfile &".htm",ForAppending,True, -1)

    fs.WriteBlankLines(3)
    fs.Write b
    fs.Close()
    Set fs=nothing
    Set bjFSO=nothing

  • 转:ASP开发中遇到的错误信息中文说明大全

    2009-05-19 15:25:46

    如 果你搞过ASP的开发,你就会为ASP中没有好的完整的调试环境而头疼不己。我收集了网上相关所有信息提示,想给它做成单机的ASP开发错误提示软件中的 数据库,但是我发现应该还有些是我所不清楚或说是了解的。所以放在这里,请知道的朋友再次提出你的观点或说更详细的信息,我将非常感激!如果有好的建议, 如果软件出来后,我将首先免费送给您尝试使用!

      再次希望看到这个文章的朋友们,能够支持和鼓励我做这个东西!(反正我觉得做这样东西的好像就没有啊),请大家指出问题并且补充!!!呵!!!!!-----------------//*

      大部分的ADO的错误码对应的含义

      除了在 Error 对象和 Errors 集合中说明的提供者错误之外,ADO 本身也将错误返回到运行时环境的异常处理机制之中。使用编程语言的错误捕获机制(如 _blank> Microsoft®Visual Basic® 中的 On Error 语句)可捕获及处理下列错误。下表将同时显示十进制和十六进制错误代码值。

    常量名称 编号 说明
    adErrInvalidArgument    3001 0x800A0BB9  应用程序使用的参数其类型错误、超出可接受的范围或者与其他参数冲突。
    adErrNoCurrentRecord    3021 0x800A0BCD BOF 或 EOF 为 True,或者当前记录已经删除。应用程序请求的操作需要当前记录。
    adErrIllegalOperation    3219 0x800A0C93 应用程序请求的操作不允许出现在该上下文中
    adErrInTransaction     3246 0x800A0CAE 在事务中应用程序无法显式关闭Connection 对象。
    adErrFeatureNotAvailable  3251 0x800A0CB3 提供者不支持应用程序请求的操作。
    adErrItemNotFound     3265 0x800A0CC1 ADO 无法在对应于应用程序请求的名称或顺序引用的集合中找到对象。
    adErrObjectInCollection  3367 0x800A0D27  无法追加,对象已经在集合中。
    adErrObjectNotSet     3420 0x800A0D5C 应用程序引用的对象不再指向有效的对象。
    adErrDataConversion    3421 0x800A0D5D 应用程序使用了不符合对当前操作的值类型。
    adErrObjectClosed     3704 0x800A0E78 如果对象关闭,则不允许应用程序请求的操作。
    adErrObjectOpen      3705 0x800A0E79 如果对象打开,则不允许应用程序请求的操作。
    adErrProviderNotFound   3706 0x800A0E7A ADO 找不到指定的提供者。
    adErrBoundToCommand    3707 0x800A0E7B 应用程序无法用 Command 对象将 Recordset 对象的 ActiveConnection 属性更改为它的来源数据。
    adErrInvalidParamInfo   3708 0x800A0E7C 应用程序错误地定义了 Parameter 对象。
    adErrInvalidConnection   3709 0x800A0E7D 应用程序通过引用关闭或无效的Connection 对象来请求对对象的操作。
    ASP错误代码说明

    错误代码 错误消息            说明
    ASP0100 Out of memory         内存不足(不能分配要求的内存
    ASP0101 Unexpected error        意外错误
    ASP0102 Expecting string input       缺少字符串输入
    ASP0103 Expecting numeric input      缺少数字输入
    ASP0104 Opration not allowed       操作不允许
    ASP0105 Index out of ange        索引超出范围(一个数组索引超届)
    ASP0106 Type Mismatch         类型不匹配(遇到的数据类型不能被处理)
    ASP0107 Stack Overflow         栈溢出(正在处理的数据超出了允许的范围)
    ASP0115 Unexpected error  意外错误(外部对象出现可捕获的exception_name错误,脚本不能继续运行)
    ASP0177 Server.CreateObject Failed    服务器创建对象失败(无效的progid)
    ASP0190 Unexpected error        意外错误(当释放外部对象,产生可捕获的错误)
    ASP0191 Unexpected error        意外错误(在外部对象的OnStartPage方法中产生可捕获的错误)
    ASP0192 Unexpected error        意外错误(在外部对象的OnEndPage方法中产生可捕获的错误
    ASP0177 Server.CreateObject Failed    服务器创建对象失败(无效的progid)
    ASP0191 Unexpected error   意外错误(在外部对象的OnStartPage方法中产生可捕获的错误)
    ASP0192 Unexpected error   意外错误(在外部对象的OnEndPage方法中产生可捕获的错误)
    ASP0193 OnStartPage Failed        在外部对象的OnStartPage方法中产生错误
    ASP0194 OnEndPage Failed        在外部对象的OnEndPage方法中产生错误
    ASP0240 s cript Engine Exception  脚本引擎从object_name对象中抛出exception_anme异常
    ASP0241 CreateObject Exception object_name对象的CreatObject方法引起了exception_name异常
    ASP0242 Query OnStartPage nterface    查询对象Object_name的OnsException

    Js cript 运行时错误

    Js cript 运行时错误是指当 Js cript 脚本试图执行一个系统不能运行的动作时导致的错误。当正在运行脚本、计算变量表达式、或者正在动态分配内存时出现Js cript 运行时错误时。
    以下是76个运行时错误

    错误号 描述
    十进制   十六进制   说明
    5      800A0005   非法过程调用或参数
    6      800A0006   溢出
    7      800A0007   内存不足
    9      800A0009   下标超界
    10      800A000A   此数组被固定或临时锁定
    11      800A000B   零除错误
    13      800A000D   类型失配
    14      800A000E   串空间不足
    17      800A0011   不能执行所请求的操作
    28      800A001C   栈空间不足
    35      800A0023   子过程或函数未找到
    48      800A0030   装载DLL出错
    51      800A0033   内部出错
    52      800A0034   坏文件名或数
    53      800A0035   文件未找到
    54      800A0036   坏文件模式
    55      800A0037   文件已经打开
    57      800A0039   设备I/O错误
    58      800A003A   文件已经存在
    61      800A003D   磁盘空间已满
    62      800A003E   输入超出文件尾
    67      800A0043   文件太多
    68      800A0044   设备不可用
    70      800A0046   权限禁用
    71      800A0047   磁盘未准备好
    74      800A004A   不能用不同的驱动重命名
    75      800A004B   路径/文件访问错误
    76      800A004C   路径未找到
    91      800A005B   对象变量或With块变量未设置
    92      800A005C   For循环未初始化
    94      800A005E   Null使用无效
    322      800A0042   不能建立所需的临时文件
    424      800A01A8   需要对象
    429      800A01A9   Automation服务器不能建立对象
    430      800A01AE   类不支持Automation
    432      800A01B0   在Automation操作中找不到文件名或类名
    438      800A01B6   对象不支持这个属性或方法
    440      800A01B8   Automation错误
    445      800A01BD   对象不支持这个动作
    446      800A01BE   对象不支持指定的参数
    447      800A01BF   对象不支持当前区域设置
    448      800A01C0   指定的参数未找到
    449      800A01C1   参数不可选
    450      800A01C2   错误的参数数目或非法属性分配
    451      800A01C3   对象不是一个集合
    453      800A01C5   指定的dll函数未找到
    458      800A01CA   变量使用了一个Js cript不支持的Automation类型
    462      800A01CE   远程服务器机器不存在或不可用
    501      800A01F5   不能分配给变量
    502      800A01F6   对象对于脚本不安全
    503      800A01F7   对象对于初始化不安全
    504      800A01F8   对象对建立不安全
    5000      800A1388   不能分配给“this”
    5001      800A1389   需要 Number 类型
    5002      800A138A   需要 Function 对象
    5003      800A138B   不能给函数返回值赋值
    5004      800A138C   不能索引对象
    5005      800A138D   需要 String
    5006      800A138E   需要 Date 对象
    5007      800A138F   需要 Object 类型
    5008      800A1390   非法赋值
    5009      800A1391   未定义标识符
    5010      800A1392   需要 Boolean
    5011      800A1393   不能执行来自一个自由脚本的代码
    5012      800A1394   需要对象的成员
    5013      800A1395   需要 VBArray
    5014      800A1396   需要 Js cript 对象
    5015      800A1397   需要 Enumerator 对象
    5016      800A1398   需要正则表达式对象
    5017      800A1399   正则表达式语法错误
    5018      800A139A   未预期的限定符
    5019      800A139B   正则表达式中缺少“]”
    5020      800A139C   正则表达式中缺少“)”
    5021      800A139D   字符集范围无效
    5022      800A139E   异常抛出,但无法抓住
    5023      800A139F   函数没有合法的 Prototype (原型)对象
    5024      800A13A0   待解码的 URI 包含有非法字符
    5025      800A13A1   待解码的 URI 编码非法
    5026      800A13A2   小数部分的位数越界
    5027      800A13A3   精度越界
    5028      800A13A4   需要 Array 或 arguments 对象
    5029      800A13A5   数组长度必须为一有限正整数
    5030      800A13A6   必须赋给数组长度一个有限正数

    js cript错误代码及相应解释大全

    Js cript 语法错误

    Js cript 语法错误是指当 Js cript 语句违反了 Js cript 脚本语言的一条或多条语法规则时导致的错误。Js cript 语法错误发生在程序编译阶段,在开始运行该程序之前。(错误发生在开发过程中),以下是32个语法错误

    错误号 描述
    十进制  十六进制   说明
    1001   800A03E9   内存不足
    1002   800A03EA   语法错误
    1003   800A03EB   需要“:”
    1004   800A03EC   需要“;”
    1005   800A03ED   需要“(”
    1006   800A03EE   需要“)”
    1007   800A03EF   需要“]”
    1008   800A03F0   需要“{”
    1009   800A03F1   需要“}”
    1010   800A03F2   需要标识符
    1011   800A03F3   需要“=”
    1012   800A03F4   需要“/”
    1013   800A03F5   无效数
    1014   800A03F6   非法字符
    1015   800A03F7   字符串常数未结束
    1016   800A03F8   注释未结束
    1018   800A03FA   函数外有 ’return’ 语句
    1019   800A03FB   在循环外不能有“break”
    1020   800A03FC   在循环外不能有“continue”
    1023   800A03FF   需要十六进制数
    1024   800A0400   需要“while”
    1025   800A0401   标签定义重复
    1026   800A0402   未找到标签
    1027   800A0403   一条 “switch” 语句中只能有一个 “default”
    1028   800A0404   需要标识符、字符串或者数字
    1029   800A0405   需要“@end”
    1030   800A0406   条件编译已关闭
    1031   800A0407   需要常数
    1032   800A0408   需要“@”
    1033   800A0409   需要“catch”
    1034   800A040A   需要“var”
    1035   800A040B   “Throw”的后面必须跟有一个表达式,且在同一源代码行上

    VBs cript 运行时错误

    如果 VBs cript 脚本执行系统无法实施的操作,则会产生 VBs cript 运行时错误。只有在运行脚本、为变量表达式赋值或分配内存时,才会产生 VBs cript 运行时错误。 以下是65个运行时错误:

    错误编号 描述
    十进制 十六进制    说明
    5    800A0005    无效过程调用或参数
    6    800A0006    溢出
    7    800A0007    内存不足
    9    800A0009    下标越界
    10    800A000A   该数组为定长的或临时被锁定
    11    800A000B   被零除
    13    800A000D   类型不匹配
    14    800A000E   字符串空间溢出
    17    800A0011   无法执行请求的操作
    28    800A001C   堆栈溢出
    35    800A0023   未定义 Sub 或 Function
    48    800A0030   加载 DLL 错误
    51    800A0033   内部错误
    52    800A0034   坏文件名或数
    53    800A0035   文件未找到
    54    800A0036   坏文件模式
    55    800A0037   文件已经打开
    57    800A0039   设备I/O错误
    58    800A003A   文件已经存在
    61    800A003D   磁盘空间已满
    62    800A003E   输入超出文件尾
    67    800A0043   文件太多
    68    800A0044   设备不可用
    70    800A0046   权限禁用
    71    800A0047   磁盘未准备好
    74    800A004A   不能用不同的驱动器重新命名
    75    800A004B   路径/文件访问错误
    76    800A004C   路径未找到
    91    800A005B   未设置对象变量
    92    800A005C   For 循环未初始化
    94    800A005E   非法使用 Null
    322    800A0142   不能建立所需临时文件
    424    800A01A8   需要对象
    429    800A01AD   ActiveX 部件无法创建对象
    430    800A01AE   类不支持自动化
    432    800A01B0   在自动化操作中未找到文件名或类名
    438    800A01B6   对象不支持该属性或方法
    440    800A01B8   Automation错误
    445    800A01BD   对象不支持此操作
    446    800A01BE   对象不支持指定的参数
    447    800A01BF   对象不支持当前的区域设置
    448    800A01C0   未找到命名参数
    449    800A01C1   参数不可选
    450    800A01C2   错误的参数个数或无效的参数属性值
    451    800A01C3   对象不是一个集合
    453    800A01C5   指定的dll函数未找到
    455    800A01C7   代码源锁错误
    457    800A01C9   这个键已经是本集合的一个元素关联
    458    800A01CA   变量使用了一个 VBs cript 中不支持的自动化(Automation)类型
    462    800A01CE   远程服务器不存在或不能访问
    481    800A01E1   无效图片
    500    800A01F4   变量未定义
    501    800A01F5   违法的分配
    502    800A01F6   脚本对象不安全
    503    800A01F7   对象不能安全初始化
    504    800A01F8   对象不能安全创建
    505    800A01F9   无效的或不合格的引用
    506    800A01FA   类未被定义
    507    800A01FB   发生异常
    5016    800A1398   需要正则表达式对象
    5017    800A1399   正则表达式中的语法错误
    5018    800A139A   错误的数量词
    5019    800A139B   在正则表达式中需要 ']'
    5020    800A139C   在正则表达式中需要 ')'
    5021    800A139D   字符集越界
    32811    800A802B   元素未找到

    vbs cript错误代码及对应解释大全

    VBs cript 语法错误

      如果 VBs cript 语句结构违反了一个或多个 VBs cript 脚本语言语法规则,就会产生VBs cript 语法错误。

      错误通常在执行程序前,编译程序时产生。 以下是53个语法错误:

    错误编号 描述
    十进制  十六进制     说明
    1001   800A03E9    内存不足
    1002    800A03EA    语法错误
    1003    800A03EB    缺少“:”
    1005    800A03ED    需要 '('
    1006    800A03EE    需要 ')'
    1007    800A03EF    缺少“]”
    1010    800A03F2    需要标识符
    1011    800A03F3    需要 '='
    1012    800A03F4    需要 'If'
    1013    800A03F5    需要 'To'
    1014    800A03F6    需要 'End'
    1015    800A03F7    需要 'Function'
    1016    800A03F8    需要 'Sub'
    1017    800A03F9    需要 'Then'
    1018    800A03FA    需要 'Wend'
    1019    800A03FB    需要 'Loop'
    1020    800A03FC    需要 'Next'
    1021    800A03FD    需要 'Case'
    1022    800A03FE    需要 'Select'
    1023    800A03FF    需要表达式
    1024    800A0400    需要语句
    1025    800A0401    需要语句的结束
    1026    800A0402    需要整数常数
    1027    800A0403    需要 'While' 或 'Until'
    1028    800A0404    需要 'While,'、 'Until,' 或语句未结束
    1029    800A0405    需要 'With'
    1030    800A0406    标识符太长
    1031    800A0407    无效的数
    1032    800A0408    无效的字符
    1033    800A0409    未结束的串常量
    1034    800A040A    未结束的注释
    1037    800A040D    无效使用关键字 'Me'
    1038    800A040E    'loop' 没有 'do'
    1039    800A040F    无效 'exit' 语句
    1040    800A0410    无效 'for' 循环控制变量
    1041    800A0411    名称重定义
    1042    800A0412    必须为行的第一个语句
    1043    800A0413    不能赋给非Byval参数
    1044    800A0414    调用 Sub 时不能使用圆括号
    1045    800A0415    需要文字常数
    1046    800A0416    需要 'In'
    1047    800A0417    需要 'Class'
    1048    800A0418    必须在一个类的内部定义
    1049    800A0419    在属性声明中需要 Let , Set 或 Get
    1050    800A041A    需要 'Property'
    1051    800A041B    参数数目必须与属性说明一致
    1052    800A041C    在类中不能有多个缺省的属性/方法
    1053    800A041D    类初始化或终止不能带参数
    1054    800A041E    Property Let 或 Set 至少应该有一个参数
    1055    800A041F    不需要的 'Next'
    1056    800A0420    只能在 ‘Property’ 或 ’Function’ 或 ’Sub’ 上指定 ’Default ’
    1057    800A0421    说明 'Default' 必须同时说明 'Public' "
    1058    800A0422    只能在 Property Get 中指定 'Default'

  • 转:Microsoft.XMLHTTP对象详解

    2009-05-19 14:22:45

    客户端调用XMLHTTP的过程很简单,只有5个步骤:
    1、创建XMLHTTP对象
    2、打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等。
    客户端通过Open命令打开与服务端的服务网页的连接。与普通HTTP指令传送一样,可以用"GET"方法或"POST"方法指向服务端的服务网页。
    3、发送指令。
    4、等待并接收服务端返回的处理结果。
    5、释放XMLHTTP对象

    定义XMLHTTP对象:

    Set bjXML = CreateObject(Msxml2.XMLHTTP) 或
    Set bjXML = CreateObject(“Microsoft.XMLHTTP”) (vbs)
    var xml = new ActiveXObject("Microsoft.XMLHTTP"(javascript)
    ' Or, for version 3.0 of XMLHTTP, use:
    Set xml = Server.CreateObject(MSXML2.ServerXMLHTTP)

    XMLHTTP方法:

    open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)
    bstrMethod: 数据传送方式,即GET或POST。用"POST"方式发送数据,可以大到4MB,也可以换为"GET",只能256KB。
    bstrUrl: 服务网页的URL。
    varAsync: 是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。
    bstrUser: 用户名,可省略。
    bstrPassword:用户口令,可省略。

    send(varBody)
    varBody:指令集。可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。也可以省略,让指令通过Open方法的URL参数代入。 发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器 返回确认消息后才结束Send进程。

    setRequestHeader(bstrHeader, bstrValue)
    bstrHeader:HTTP 头(header)
    bstrValue:HTTP 头(header)的值
    如果Open方法定义为POST,可以定义表单方式上传:
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

    abort
    取消当前 HTTP 请求

    getAllResponseHeaders
    从响应信息中检索所有的标头字段

    getResponseHeader
    从响应信息正文中获得一个 HTTP 标头值

    三、XMLHTTP属性:

    onreadystatechange
    在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。

    readyState
    XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
    值 说明
    0 Response对象已经创建,但XML文档上载过程尚未结束
    1 XML文档已经装载完毕
    2 XML文档已经装载完毕,正在处理中
    3 部分XML文档已经解析
    4 文档已经解析完毕,客户端可以接受返回消息

    responseBody
    Variant型 结果返回为无符号整数数组

    responseStream
    Variant型 结果返回为IStream流

    responseText
    string型 结果返回为字符串。

    responseXML
    object型 结果返回为XML格式数据。

    status
    Long型 服务器返回的HTTP状态码

    statusText
    String型 服务器HTTP响应行状态
     

    附录

    (一) HTTP 1.1支持的状态代码

    100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分
    101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议
    200 OK 一切正常,对GET和POST请求的应答文档跟在后面。
    201 Created 服务器已经创建了文档,Location头给出了它的URL。
    202 Accepted 已经接受请求,但处理尚未完成。
    203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝
    204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的
    205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容
    206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它
    300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
    301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
    302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。
    303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取
    304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
    305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取
    307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只 能跟随对GET请求的重定向。
    400 Bad Request 请求出现语法错误。
    401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
    403 Forbidden 资源不可用。
    404 Not Found 无法找到指定位置的资源
    405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。
    406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容
    407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。
    408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。
    409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。
    410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。
    411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。
    412 Precondition Failed 请求头中指定的一些前提条件失败
    413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头
    414 Request URI Too Long URI太长
    416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头
    500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求
    501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求
    502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答
    503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头
    504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答
    505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本


    loading...


    2006-1-22
    关于XML(XMLHTTP)跨域加载数据不会出现跨域的安全提示信息的问题

    网上看了很多资料,但好象很少人谈到跨域读取XML文档的问题,有些论坛或BLOG关于XML跨域读取的问题,实现起来非法复杂。
    在这里我介绍一下XMLHTTP跨域读取页面数据的问题,以JS为例

    一、读取数据

    //建立对象
    var xml = new ActiveXObject("Microsoft.XMLHTTP"

    //这里的abc.xml是被读取的文件,当然也可以换成别的文件,false表示非异步传输,async是asynchronism简写
    xml.open("get","http://www.mydomain.com/abc.xml",false)
    xml.send()


    二、在被读取数据的域根下(上例是在www.mydomain.com/下),建立一个XML 策略文件,名字一定要是crossdomain.xml。

    在策略文件中加入以下代码
    <?xml version="1.0"?>
    <cross-domain-policy>
    <allow-access-from domain="www.mydomain.com"/> //domain属性的值就是被允许从本站读取数据的来源域名
    </cross-domain-policy>


    这样就完成了跨域读取数据并不会出现跨域的安全提示信息了

    网址:http://hi.baidu.com/bnzm5270/blog/item/84244be781ef9929b838206b.html

  • 转:音频编码汇总

    2009-05-06 16:56:56

    PCMU(G.711U)

    类型:Audio
    制定者:ITU-T
    所需频宽:64Kbps(90.4)
    特性:PCMU和PCMA都能提供较好的语音质量,但是它们占用的带宽较高,需要64kbps。
    优点:语音质量优
    缺点:占用的带宽较高
    应用领域:voip
    版税方式:Free
    备 注:PCMU and PCMA都能够达到CD音质,但是它们消耗的带宽也最多(64kbps)。如果网络带宽比较低,可以选用低比特速率的编码方法,如G.723或 G.729,这两种编码的方法也能达到传统长途电话的音质,但是需要很少的带宽(G723需要5.3/6.3kbps,G729需要8kbps)。如果带 宽足够并且需要更好的语音质量,就使用PCMU 和 PCMA,甚至可以使用宽带的编码方法G722(64kbps),这可以提供有高保真度的音质。
                                                                                                                

    PCMA(G.711A)
    类型:Audio
    制定者:ITU-T
    所需频宽:64Kbps(90.4)
    特性:PCMU和PCMA都能提供较好的语音质量,但是它们占用的带宽较高,需要64kbps。
    优点:语音质量优
    缺点:占用的带宽较高
    应用领域:voip
    版税方式:Free
    备 注:PCMU and PCMA都能够达到CD音质,但是它们消耗的带宽也最多(64kbps)。如果网络带宽比较低,可以选用低比特速率的编码方法,如G.723或 G.729,这两种编码的方法也能达到传统长途电话的音质,但是需要很少的带宽(G723需要5.3/6.3kbps,G729需要8kbps)。如果带 宽足够并且需要更好的语音质量,就使用PCMU 和 PCMA,甚至可以使用宽带的编码方法G722(64kbps),这可以提供有高保真度的音质。



    ADPCM(自适应差分PCM)
    类型:Audio
    制定者:ITU-T
    所需频宽:32Kbps
    特性:ADPCM(adaptive difference pulse code modulation)综合了APCM的自适应特性和DPCM系统的差分特性,是一种性能比较好的波形编码。它的核心想法是:
           ①利用自适应的思想改变量化阶的大小,即使用小的量化阶(step-size)去编码小的差值,使用大的量化阶去编码大的差值;
           ②使用过去的样本值估算下一个输入样本的预测值,使实际样本值和预测值之间的差值总是最小。
    优点:算法复杂度低,压缩比小(CD音质>400kbps),编解码延时最短(相对其它技术)
    缺点:声音质量一般
    应用领域:voip
    版税方式:Free
    备 注:ADPCM (ADPCM Adaptive Differential Pulse Code Modulation), 是一种针对 16bit (或者更高?) 声音波形数据的一种有损压缩算法, 它将声音流中每次采样的 16bit 数据以 4bit 存储, 所以压缩比 1:4. 而压缩/解压缩算法非常的简单, 所以是一种低空间消耗,高质量声音获得的好途径。
                                                                                                                  

    LPC(Linear Predictive Coding,线性预测编码)
    类型:Audio
    制定者:
    所需频宽:2Kbps-4.8Kbps
    特性:压缩比大,计算量大,音质不高,廉价
    优点:压缩比大,廉价
    缺点:计算量大,语音质量不是很好,自然度较低
    应用领域:voip
    版税方式:Free
    备 注:参数编码又称为声源编码,是将信源信号在频率域或其它正交变换域提取特征参数,并将其变换成数字代码进行传输。译码为其反过程,将收到的数字序列经变 换恢复特征参量,再根据特征参量重建语音信号。具体说,参数编码是通过对语音信号特征参数的提取和编码,力图使重建语音信号具有尽可能高的准确性,但重建 信号的波形同原语音信号的波形可能会有相当大的差别。如:线性预测编码(LPC)及其它各种改进型都属于参数编码。该编码比特率可压缩到2Kbit/s- 4.8Kbit/s,甚至更低,但语音质量只能达到中等,特别是自然度较低。


    CELP(Code Excited Linear Prediction,码激励线性预测编码)
    类型:Audio
    制定者:欧洲通信标准协会(ETSI)
    所需频宽:4~16Kbps的速率
    特性:改善语音的质量:
           ① 对误差信号进行感觉加权,利用人类听觉的掩蔽特性来提高语音的主观质量;
           ②用分数延迟改进基音预测,使浊音的表达更为准确,尤其改善了女性语音的质量;
           ③ 使用修正的MSPE准则来寻找 “最佳”的延迟,使得基音周期延迟的外形更为平滑;
           ④根据长时预测的效率,调整随机激励矢量的大小,提高语音的主观质量;       ⑤ 使用基于信道错误率估计的自适应平滑器,在信道误码率较高的情况下也能合成自然度较高的语音。
           结论:
           ① CELP算法在低速率编码环境下可以得到令人满意的压缩效果;
           ②使用快速算法,可以有效地降低CELP算法的复杂度,使它完全可以实时地实现;
           ③CELP可以成功地对各种不同类型的语音信号进行编码,这种适应性对于真实环境,尤其是背景噪声存在时更为重要。
    优点:用很低的带宽提供了较清晰的语音
    缺点:
    应用领域:voip
    版税方式:Free
    备 注:1999年欧洲通信标准协会(ETSI)推出了基于码激励线性预测编码(CELP)的第三代移动通信语音编码标准自适应多速率语音编码器(AMR), 其中最低速率为4.75kb/s,达到通信质量。CELP 码激励线性预测编码是Code Excited Linear Prediction的缩写。CELP是近10年来最成功的语音编码算法。
           CELP语音编码算法用线性预测提取声道参数,用一个包含许多典型的激励矢量的码本作为激励参数,每次编码时都在这个码本中搜索一个最佳的激励矢量,这个激励矢量的编码值就是这个序列的码本中的序号。
           CELP已经被许多语音编码标准所采用,美国联邦标准FS1016就是采用CELP的编码方法,主要用于高质量的窄带语音保密通信。CELP (Code-Excited Linear Prediction) 这是一个简化的 LPC 算法,以其低比特率著称 (4800-9600Kbps),具有很清晰的语音品质和很高的背景噪音免疫性。CELP是一种在中低速率上广泛使用的语音压缩编码方案。
                                                                                                             

    G.711
    类型:Audio
    制定者:ITU-T
    所需频宽:64Kbps
    特性:算法复杂度小,音质一般
    优点:算法复杂度低,压缩比小(CD音质>400kbps),编解码延时最短(相对其它技术)
    缺点:占用的带宽较高
    应用领域:voip
    版税方式:Free
    备注:70年代CCITT公布的G.711 64kb/s脉冲编码调制PCM。
                                                                                                                

    G.721
    类型:Audio
    制定者:ITU-T
    所需频宽:32Kbps
    特性:相对于PCMA和PCMU,其压缩比较高,可以提供2:1的压缩比。
    优点:压缩比大
    缺点:声音质量一般
    应用领域:voip
    版税方式:Free
    备注:子带ADPCM(SB-ADPCM)技术。G.721标准是一个代码转换系统。它使用ADPCM转换技术,实现64 kb/s A律或μ律PCM速率和32 kb/s速率之间的相互转换。


    G.722
    类型:Audio
    制定者:ITU-T
    所需频宽:64Kbps
    特性:G722能提供高保真的语音质量
    优点:音质好
    缺点:带宽要求高
    应用领域:voip
    版税方式:Free
    备注:子带ADPCM(SB-ADPCM)技术
                                                                                                                  

    G.723(低码率语音编码算法)
    类型:Audio
    制定者:ITU-T
    所需频宽:5.3Kbps/6.3Kbps
    特性:语音质量接近良,带宽要求低,高效实现,便于多路扩展,可利用C5402片内16kRAM实现53coder。达到ITU-TG723要求的语音质量,性能稳定。可用于IP电话语音信源编码或高效语音压缩存储。
    优点:码率低,带宽要求较小。并达到ITU-TG723要求的语音质量,性能稳定。
    缺点:声音质量一般
    应用领域:voip
    版税方式:Free
    备 注:G.723语音编码器是一种用于多媒体通信,编码速率为5.3kbits/s和6.3kbit/s的双码率编码方案。G.723标准是国际电信联盟 (ITU)制定的多媒体通信标准中的一个组成部分,可以应用于IP电话等系统中。其中,5.3kbits/s码率编码器采用多脉冲最大似然量化技术 (MP-MLQ),6.3kbits/s码率编码器采用代数码激励线性预测技术。
                                                                                                                

    G.723.1(双速率语音编码算法)
    类型:Audio
    制定者:ITU-T
    所需频宽:5.3Kbps(22.9)
    特 性:能够对音乐和其他音频信号进行压缩和解压缩,但它对语音信号来说是最优的。G.723.1采用了执行不连续传输的静音压缩,这就意味着在静音期间的比 特流中加入了人为的噪声。除了预留带宽之外,这种技术使发信机的调制解调器保持连续工作,并且避免了载波信号的时通时断。
    优点:码率低,带宽要求较小。并达到ITU-TG723要求的语音质量,性能稳定,避免了载波信号的时通时断。
    缺点:语音质量一般
    应用领域:voip
    版税方式:Free
    备注:G.723.1算法是 ITU-T建议的应用于低速率多媒体服务中语音或其它音频信号的压缩算法,其目标应用系统包括H.323、H.324等多媒体通信系统 。目前该算法已成为IP电话系统中的必选算法之一。
                                                                                                                   

    G.728
    类型:Audio
    制定者:ITU-T
    所需频宽:16Kbps/8Kbps
    特性:用于IP电话、卫星通信、语音存储等多个领域。G.728是一种低时延编码器,但它比其它的编码器都复杂,这是因为在编码器中必须重复做50阶LPC分析。G.728还采用了自适应后置滤波器来提高其性能。
    优点:后向自适应,采用自适应后置滤波器来提高其性能
    缺点:比其它的编码器都复杂
    应用领域:voip
    版税方式:Free
    备注:G.728 16kb/s短延时码本激励线性预测编码(LD-CELP)。1996年ITU公布了G.728 8kb/s的CS-ACELP算法,可以用于IP电话、卫星通信、语音存储等多个领域。16 kbps G.728低时延码激励线性预测。
           G.728是低比特线性预测合成分析编码器(G.729和G.723.1)和后向ADPCM编码器的混合体。G.728是LD-CELP编码器,它一次只 处理5个样点。对于低速率(56~128 kbps)的综合业务数字网(ISDN)可视电话,G.728是一种建议采用的语音编码器。由于其后向自适应特性,因此G.728是一种低时延编码器,但 它比其它的编码器都复杂,这是因为在编码器中必须重复做50阶LPC分析。G.728还采用了自适应后置滤波器来提高其性能。


    G.729
    类型:Audio
    制定者:ITU-T
    所需频宽:8Kbps
    特性:在良好的信道条件下要达到长话质量,在有随机比特误码、发生帧丢失和多次转接等情况下要有很好的稳健性等。这种语音压缩算法可以应用在很广泛的领域中,包括IP电话、无线通信、数字卫星系统和数字专用线路。
           G.729算法采用“共轭结构代数码本激励线性预测编码方案”(CS-ACELP)算法。这种算法综合了波形编码和参数编码的优点,以自适应预测编码技术为基础,采用了矢量量化、合成分析和感觉加权等技术。
           G.729编码器是为低时延应用设计的,它的帧长只有10ms,处理时延也是10ms,再加上5ms的前视,这就使得G.729产生的点到点的时延为25ms,比特率为8 kbps。
    优点:语音质量良,应用领域很广泛,采用了矢量量化、合成分析和感觉加权,提供了对帧丢失和分组丢失的隐藏处理机制
    缺点:在处理随机比特错误方面性能不好。
    应用领域:voip
    版税方式:Free
    备 注:国际电信联盟(ITU-T)于1995年11月正式通过了G.729。 ITU-T建议G.729也被称作“共轭结构代数码本激励线性预测编码方案”(CS-ACELP),它是当前较新的一种语音压缩标准。G.729是由美 国、法国、日本和加拿大的几家著名国际电信实体联合开发的。
                                                                                                                   

    G.729A
    类型:Audio
    制定者:ITU-T
    所需频宽:8Kbps(34.4)
    特性:复杂性较G.729低,性能较G.729差。
    优点:语音质量良,降低了计算的复杂度以便于实时实现,提供了对帧丢失和分组丢失的隐藏处理机制
    缺点:性能较G.729差
    应用领域:voip
    版税方式:Free
    备注:96年ITU-T又制定了G.729的简化方案G.729A,主要降低了计算的复杂度以便于实时实现,因此目前使用的都是G.729A。
                                                                                                          

    GIPS
    类型:Audio
    制定者:瑞典Global IP Sound公司
    所需频宽:
    特性:GIPS技术可根据带宽状况自动调节编码码率,提供低码率高质量的音频。GIPS的核心技术(网络自适应算法,丢包补偿算法和回声消除算法)可很好地解决语音延迟与回声问题,带来完美音质,提供比电话还清晰的语音通话效果。
    优点:很好地解决语音延迟与回声问题,带来完美音质,提供比电话还清晰的语音通话效果
    缺点: 不是Free
    应用领域:voip
    版税方式:每年支付一笔使用权费用
    备 注:GIPS音频技术是由来自瑞典的全球顶尖的语音处理高科技公司--"GLOBAL IP SOUND"提供的专用于互联网的语音压缩引擎系统。GIPS技术可根据带宽状况自动调节编码码率,提供低码率高质量的音频。GIPS的核心技术(网络自 适应算法,丢包补偿算法和回声消除算法)可很好地解决语音延迟与回声问题,带来完美音质,提供比电话还清晰的语音通话效果。
                                                                                                             

    Apt-X
    类型:Audio
    制定者:Audio Processing Technology 公司
    所需频宽:10Hz to 22.5 kHz,56kbit/s to 576 kbit/s(16 bit 7.5 kHz mono to 24-bit, 22.5kHz stereo)
    特性:主要用于专业音频领域,提供高品质的音频。其特点是:
           ①采用4:1:4的压缩与放大方案;
           ②硬件低复杂度;
           ③极低的编码延迟;
           ④由单芯片实现;
           ⑤单声道或立体声编解码;
           ⑥只需单设备即可实现22.5kHz的双通道立体声;
           ⑦高达48kHz的采样频率;
           ⑧容错性好;
           ⑨完整的AUTOSYNC™编解码同步方案;
           ⑩低功率消耗
    优点:高品质的音频,硬件复杂度低,设备要求低
    缺点:不是Free
    应用领域:voip
    版税方式:一次性付费
    备注:子带ADPCM(SB-ADPCM)技术


    NICAM(Near Instantaneous Companded Audio Multiplex 准瞬时压扩音频复用)
    类型:Audio
    制定者:英国BBC广播公司
    所需频宽:728Kbps
    特性:应用范围及其广泛,可用它进行立体声或双语广播
    优点:应用范围及其广泛,信噪比高,动态范围宽、音质同CD相媲美,故名丽音,因此NICAM又称为丽音
    缺点:不是Free,频宽要求高
    应用领域:voip
    版税方式:一次性付费
    备注:NICAM也称丽音,它是英文Near-Instantaneously Companded Audio Multiplex的缩写,其含义为准瞬时压扩音频复用,是由英国BBC广播公司开发研究成功的。
           通俗地说NICAM技术实际上就是双声道数字声技术,其应用范围及其广泛,最典型的应用便是电视广播附加双声道数字声技术,利用它进行立体声或双语广播, 以充分利用电视频道的频谱资源。这是在常规电视广播的基础上无需增加许多投资就可以实现的。在进行立体声广播时,它提高了音频的信号质量,使其接近CD的 质量。而且还可以利用NICAM技术进行高速数据广播及其他数据传输的增殖服务,这在当今的信息化社会中似乎就显得尤为重要了!
                                                                                                          

    MPEG-1 audio layer 1
    类型:Audio
    制定者:MPEG
    所需频宽:384kbps(压缩4倍)
    特性:编码简单,用于数字盒式录音磁带,2声道,VCD中使用的音频压缩方案就是MPEG-1层Ⅰ。
    优点:压缩方式相对时域压缩技术而言要复杂得多,同时编码效率、声音质量也大幅提高,编码延时相应增加。可以达到“完全透明”的声音质量(EBU音质标准)
    缺点:频宽要求较高
    应用领域:voip
    版税方式:Free
    备注:MPEG-1声音压缩编码是国际上第一个高保真声音数据压缩的国际标准,它分为三个层次:
    --层1(Layer 1):编码简单,用于数字盒式录音磁带
    --层2(Layer 2):算法复杂度中等,用于数字音频广播(DAB)和VCD等
    --层3(Layer 3):编码复杂,用于互联网上的高质量声音的传输,如MP3音乐压缩10倍
                                                                                                                

    MUSICAM(MPEG-1 audio layer 2,即MP2)
    类型:Audio
    制定者:MPEG
    所需频宽:256~192kbps(压缩6~8倍)
    特性:算法复杂度中等,用于数字音频广播(DAB)和VCD等,2声道,而MUSICAM由于其适当的复杂程度和优秀的声音质量,在数字演播室、DAB、DVB等数字节目的制作、交换、存储、传送中得到广泛应用。
    优点:压缩方式相对时域压缩技术而言要复杂得多,同时编码效率、声音质量也大幅提高,编码延时相应增加。可以达到“完全透明”的声音质量(EBU音质标准)
    缺点:
    应用领域:voip
    版税方式:Free
    备注:同MPEG-1 audio layer 1
                                                                                                       

    MP3(MPEG-1 audio layer 3)
    类型:Audio
    制定者:MPEG
    所需频宽:128~112kbps(压缩10~12倍)
    特 性:编码复杂,用于互联网上的高质量声音的传输,如MP3音乐压缩10倍,2声道。MP3是在综合MUSICAM和ASPEC的优点的基础上提出的混合压 缩技术,在当时的技术条件下,MP3的复杂度显得相对较高,编码不利于实时,但由于MP3在低码率条件下高水准的声音质量,使得它成为软解压及网络广播的 宠儿。
    优点:压缩比高,适合用于互联网上的传播
    缺点:MP3在128KBitrate及以下时,会出现明显的高频丢失
    应用领域:voip
    版税方式:Free
    备注:同MPEG-1 audio layer 1

    MPEG-2 audio layer
    类型:Audio
    制定者:MPEG
    所需频宽:与MPEG-1层1,层2,层3相同
    特性:MPEG-2的声音压缩编码采用与MPEG-1声音相同的编译码器,层1, 层2和层3的结构也相同,但它能支持5.1声道和7.1声道的环绕立体声。
    优点:支持5.1声道和7.1声道的环绕立体声
    缺点:
    应用领域:voip
    版税方式:按个收取
    备注:MPEG-2的声音压缩编码采用与MPEG-1声音相同的编译码器,层1, 层2和层3的结构也相同,但它能支持5.1声道和7.1声道的环绕立体声。


    AAC(Advanced Audio Coding,先进音频编码)
    类型:Audio
    制定者:MPEG
    所需频宽:96-128 kbps
    特性:AAC可以支持1到48路之间任意数目的音频声道组合、包括15路低频效果声道、配音/多语音声道,以及15路数据。它可同时传送16套节目,每套节目的音频及数据结构可任意规定。
           AAC主要可能的应用范围集中在因特网网络传播、数字音频广播,包括卫星直播和数字AM、以及数字电视及影院系统等方面。AAC使用了一种非常灵活的熵编 码核心去传输编码频谱数据。具有48 个主要音频通道,16 个低频增强通道,16 个集成数据流, 16 个配音,16 种编排。
    优点:支持多种音频声道组合,提供优质的音质
    缺点:
    应用领域:voip
    版税方式:一次性收费
    备注:AAC于1997年形成国际标准ISO 13818-7。先进音频编码(Advanced Audio Coding--AAC)开发成功,成为继MPEG-2音频标准(ISO/IEC13818-3)之后的新一代音频压缩标准。
           在MPEG-2制订的早期,本来是想将其音频编码部分保持与MPEG-1兼容的。但后来为了适应演播电视的要求而将其定义成为一个可以获得更高质量的多声 道音频标准。理所当然地,这个标准是不兼容MPEG-1的,因此被称为MPEG-2 AAC。换句话说,从表面上看,要制作和播放AAC,都需要使用与MP3完全不同的工具。
                                                                                                                

    Dolby AC-3
    类型:Audio
    制定者:美国杜比公司
    所需频宽:64kbps
    特性:提供的环绕立体声系统由5个全频带声道加一个超低音声道组成,6个声道的信息在制作和还原过程中全部数字化,信息损失很少,细节丰富,具有真正的立体声效果,在数字电视、DVD和家庭影院中广泛使用。
    优点:环绕立体声,信息损失很少,细节丰富,具有真正的立体声效果
    缺点:
    应用领域:voip
    版税方式:按个收取
    备 注:杜比数字AC-3(Dolby Digital AC-3):美国杜比公司开发的多声道全频带声音编码系统,它提供的环绕立体声系统由5个全频带声道加一个超低音声道组成,6个声道的信息在制作和还原过 程中全部数字化,信息损失很少,细节丰富,具有真正的立体声效果,在数字电视、DVD和家庭影院中广泛使用。
                                                                                                               

    ASPEC(Audio Spectral Perceptual Entropy Coding)
    类型:Audio
    制定者:AT&T
    所需频宽:64kps
    特性:音频质量获得显著改善,不过计算复杂度也大大提高,而且在回响、低码率时声音质量严重下降。
    优点:音频质量获得显著改善
    缺点:计算复杂度的提高。块边界影响、预计算复杂度的提高。回响、低码率时声音质量严重下降
    应用领域:voip
    版税方式:按个收取
    备注:变换压缩技术
                                                                                                      

    PAC(Perceptual Audio Coder)
    类型:Audio
    制定者:AT&T
    所需频宽:64kps
    特性:音频质量获得显著改善,不过在回响、低码率时声音质量严重下降。
    优点:音频质量获得显著改善
    缺点:块边界影响、预回响、低码率时声音质量严重下降
    应用领域:voip
    版税方式:按个收取
    备注:变换压缩技术
                                                                                                       

    HR
    类型:Audio
    制定者: 飞利浦
    所需频宽:8Kbps
    特性:以增加GSM网络容量为目的,但是会损害语音质量;由于现在网络频率紧缺,一些大的运营商已经在大城市密集地带开通此方式以增加容量。
    优点:系统容量大
    缺点:语音质量差
    应用领域:GSM
    版税方式:按个收费
    备注:HF半速率,是一种GSM语音编码方式。


    FR
    类型:Audio
    制定者:飞利浦
    所需频宽:13Kbps
    特性:是一般的GSM手机的通信编码方式,可以获得达到4.1左右Qos的语音通信质量(国际电联规定语音通信质量Qos满分为5)
    优点:语音质量得到了提高
    缺点:系统容量降低
    应用领域:GSM
    版税方式:按个收费
    备注:FR全速率,是一种GSM语音编码方式。
                                                                                  

    EFR
    类型:Audio
    制定者:飞利浦
    所需频宽:13Kbps
    特性:用于GSM手机基于全速率13Kbps的语音编码和发送,可以获得更好更清晰的语音质量(接近Qos4.7),需要网络服务商开通此项网络功能,手机才能配合实现。
    优点:音质好
    缺点:需要网络服务商开通此项网络功能,且系统容量降低
    应用领域:GSM
    版税方式:按个收费
    备注:EFR增强型全速率,一种GSM网络语音的编码方式。


    GSM-AMR(Adaptive Multi-Rate)
    类型:Audio
    制定者:飞利浦
    所需频宽:8Kbps(4.75 Kbps~12.2 Kbps)
    特性: 可以对语音进行替换和消音,平滑噪音,支持间断式传输,对语音进行动态侦查。能在各种网络条件下提供优质的语音效果。
    优点:音质出色
    缺点:
    应用领域:GSM
    版税方式:按个收费
    备 注:GSM-ASM是一种广泛使用在GPRS和W-CDMA网络上的音频标准。在规范ETSI GSM06.90中对GSM-AMR进行了定义。AMR语音编码是GSM 2+和WCDMA的默认编码标准,是第三代无线通讯系统的语音编码标准。GSM-AMR标准基于ACELP(代数激励线性预测)编码。它能在广泛的传输条 件下提供高品质的语音效果。
                                                                                                      

    EVRC(Enhanced Variable Rate Coder,增强型可变速率编码器)
    类型:Audio
    制定者:美国Qualcomm通信公司(即高通)
    所需频宽:8Kbps或13Kbps
    特性:支持三种码率(9.6 Kbps, 4.8 Kbps 和 1.2 Kbps),噪声抑制,邮件过滤。能在各种网络条件下提供优质的语音效果。
    优点:音质出色
    缺点:
    应用领域:CDMA
    版税方式:按个收费
    备 注:EVRC编码广泛使用于CDMA网络。EVRC标准遵循规范TIA IS-127的内容。EVRC编码基于RCELP(松弛码激励线性预测)标准。该编码可以以Rate 1(171bits/packet),Rate 1/2(80bits/packet)或是Rate 1/8(16bits/packet)的容量进行操作。在要求下,它也能产生空包(0bits/packet)。


    QCELP(QualComm Code Excited Linear Predictive,受激线性预测编码)
    类型:Audio
    制定者:美国Qualcomm通信公司(即高通)
    所需频宽:8k的语音编码算法(可工作于4/4.8/8/9.6Kbps等固定速率上,而且可变速率地工作于800Kbps~9600Kbps之间)
    特 性:使用适当的门限值来决定所需速率。QCELP是一种8k的语音编码算法(可以在8k的速率下提供接近13k的话音压缩质量)。这是一种可变速率话音编 码,根据人的说话特性(大家应该能够体会我们日常的沟通和交流时并不是一直保持某种恒定的方式讲话,有间断、有不同的声音频率等都是人的自然表达)而采取 的一种优化技术。
    优点:话音清晰、背景噪声小,系统容量大
    缺点: 不是Free
    应用领域:CDMA
    版税方式:每年支付一笔使用权费用
    备 注:QCELP,即QualComm Code Excited Linear Predictive(QualComm受激线性预测编码)。美国Qualcomm通信公司的专利语音编码算法,是北美第二代数字移动电话(CDMA)的 语音编码标准(IS95)。这种算法不仅可工作于4/4.8/8/9.6kbit/s等固定速率上,而且可变速率地工作于 800bit/s~9600bit/s之间。QCELP算法被认为是到目前为止效率效率最高的一种算法,它的主要特点之一,是使用适当的门限值来决定所需 速率。I‘1限值懈景噪声电平变化而变化,这样就抑制了背景噪声,使得即使在喧闹的环境中,也能得到良好的话音质量, CDMA8Kbit/s的话音近似GSM 13Mbit/s的话音。CDMA采用QCELP编码等一系列技术,具有话音清晰、背景噪声小等优势,其性能明显 优于其他无线移动通信系统,语音质量可以与有线电话媲美。 无线辐射低。
  • 转:常用编解码介绍(网上的资料)

    2009-05-06 16:54:45

    这里只对常见的视频音频编码做一个系统的简单介绍,并不进行详细探讨。由于我的知识有限,难免有错误的地方,欢迎来信指正。

    MPEG 系列

    MPEG 即(Moving Pictures Experts Group 运动图象专家组,属于ISOInternational Organization for Standardization 国际标准组织,他们开发了一系列视频音频编码,最为大家熟悉的就是 MP3MPEG-1/2/4

    • MPEG-1

    较早的视频编码,质量比较差,主要用于 CD-ROM 存储视频,国内最为大家熟悉的就是 VCDVideo CD),他的视频编码就是采用 MPEG-1

    • MPEG-2

    MPEG-1 的基础上开发的一种视频编码,它的质量远远好于 MPEG-1,所以被运用在了 DVD-Video 上面,MPEG-2 DVD-Video 唯一指定的视频编码。MPEG-2 不光运用于 DVD-Video ,现在大部分 HDTV(高清电视)也采用 MPEG-2 编码,分辨率达到了 1920x1080。由于 MPEG-2 的普及,本来为 HDTV 准备的 MPEG-3 最终宣告放弃。

    • MPEG-4

    为了应对网络传输等环境,传统的 MPEG-1/2 已经不能适应,所以促使了 MPEG-4 的诞生。MPEG-4 采用了一系列新技术,来满足在低带宽下传输较高视频质量的需求。DivXXviDMS MPEG4 都是采用的 MPEG-4 视频编码,除了在 DVDRip 上面的应用,3GPP 现在也接纳了 MPEG-4 作为视频编码方案。

    • MPEG-4 AVC

    它和 MPEG-4 是两种不同的编码,主要是在极低码率下 MPEG-4 表现并不好,而 AVC 更加适合低带宽传输。在高码率上,AVC 的表现也要好过 MPEG-4,所以现在大有取代 MPEG-4 的趋势。下一代 HD DVD Blue Ray Disc 已经正式接纳 AVC 为视频编码方案之一,相信 AVC 的发展前途会非常好。

    • MPEG Audio Layer 1/2

    也就是 MP1MP2 ,较早的音频编码,是 MP3 的前身,主要用于 VCDDVDSVCD 的音频编码。

    • MPEG Audio Layer 3

    大名鼎鼎的 MP3,已经成为网络音频的主流格式,能在 128kbps 的码率接近 CD 音质。

    • MPEG-2 AAC

    MPEG-2 上开发的一种新的音频编码,和传统的 MPEG Audio 不兼容,它的质量理论上高于 MP3,并且支持多声道。在 96kbps 的码率范围内就能接近 CD 音质,比 MP3 更加适合地码率传输。

    • MPEG-4 AAC

    AAC 已经作为 MPEG-4 标准的音频编码,当然 MPEG-4 Audio 还有其他多种音频编码。

    • MPEG-4 aacPlus

    采用了 SBR 频带复制技术的 AACSBR 技术能够让音频编码降低一半的码率而音质不会有太大改变,已经成为 MPEG-4 标准的一部分。

    • MPEG-4 VQF

    NTT 开发的一种音频格式,曾经销声匿迹了一段时间,只在 Nero 里面见到过它的身影。现在搭上 SBR 技术又进入了 MPEG-4 标准,似乎不甘心就这么被遗忘,据说在低比特率下表现比 aacPlus 更好。

    • mp3PRO

    MP3 加上 SBR 技术诞生的一种产品,但是并没有得到多大推广,更没有进入标准。

    • MP3 Surround

    MP3 插上多声道的翅膀,Fraunhofer 开发的又一种 MP3 升级产品,听说 DivX 6 准备将它作为音频编码。Fraunhofer 一直都在围绕着 MP3 升级,mp3PROMP3 Surround,这些产品都能和传统 MP3 兼容,但是随着层出不穷的新编码,不知道 MP3 还能走多远。

    DVD系列

    说了 MPEG ,就不能不提这个 MPEG-2 最大受益者——DVD。当然,这里是指 DVD-Video DVD-Audio,也会涉及一些HD DVDDVD 的编码都属于应用级的,它们自己并不开发编码,这一点要和 MPEG 区别开来。

    • Dolby Digital AC3

    DVD 事实上的音频编码标准,现在所有的 DVD 都采用它压缩音频,提供了最大 5.1 声道的输出支持,能在有限的空间存储高质的音频。

    • Dolby Digital Plus

    下一代 HD DVD 的音频编码,是 AC3 的升级版本,支持 7.1 甚至更多的声道,码率范围也有大幅提升。

    • MLP Lossless

    HD DVD 上的无损音频编码,同样为 Dolby 公司开发,最高采样能达到 192KHz,也为 DVD-Audio 的音频编码标准。

    • DTS

    DTS 最初是为电影院开发的音频系统,后来才应用于 DVD 中。它是 AC3 的有力竞争者,不过在 DVD 中只有 D9 才能够看到他的身影,虽然广大发烧友都在鼓吹它的效果超过 AC3,但是测试出来并不如想象中的那么好,特别是高频方面不及 AC3

    • DTS-HD

    下一代 HD DVD 的音频编码,它和 Dolby Digital Plus 都被指定为强制编码,看来在未来会和 Dolby 平分秋色。

    • LPCM

    没有压缩的 PCM 编码,只能存储两声道,但是采样率能够高达 96KHz,是 DVD-Video 中音质最好的一种,当然体积也是最大的。

    • MPEG Audio

    主要是 MP2,应用于 PAL 制式的 DVD,压缩率高,支持多声道(MPEG-2 规范都支持多声道)。

    • DSD

    这个似乎扯远了,不过作为 DVD-Audio 的最大竞争对手 SACD,顺带介绍一下。DSDDirect Stream Digital)直接比特流数字,由 Sony 推出,能够避免传统 PCM 编码的弊端,达到非常高的品质。最高采样和 DVD-Audio 一样,192KHz

    H.26X系列

    “ITUInternational Telecommunication Union)国际电传视讯联盟主导的编码系列,主要应用于实时视频通信领域,如会议电视等。由于现在 MPEG 系列也开始向这个领域进军,所以这两个组织也开始了密切的合作,如最近热门的 AVC/H.264,就是由 ITU 旗下的“VCEGVideo Coding Experts Group)视频编码专家组“ISOInternational Organization for Standardization)国际标准组织旗下的“MPEG Moving Pictures Experts Group)运动图象专家组联合制作发布的。

    • H.261

    H.261ITU-T为在综合业务数字网(ISDN)上开展双向声像业务(可视电话、视频会议)而制定的,它是最早的运动图像压缩标准,它详细制定了视频编码的各个部分,包括运动补偿的帧间预测、DCT变换、量化、熵编码,以及与固定速率的信道相适配的速率控制等部分。

    • H.263

    H.263ITU-T为低于64kb/s的窄带通信信道制定的视频编码标准,它是在H.261基础上发展起来的。

    • H.263+

    H.263 的第二个版本,加入了许多新技术来扩展 H.263 的应用范围。

    • H.263++

    H.263+ 上增加了几个选项,来增强码流在恶劣信道上的抗误码性能,同时提高增强编码效率。

    • H.264

    也就是前面提到的 MPEG-4 AVCH.264是由ISO/IECITU-T组成的联合视频组(JVT)制定的新一代视频压缩编码标准。在ISO/IEC中该标准命名为AVC (Advanced Video Coding),作为MPEG-4标准的第10个选项;在ITU-T中正式命名为H.264标准。

    3GPP

    现在通讯领域最热门的话题之一,既然说了 MPEG ITU,和这两个千丝万缕的 3GPP 应用就不得不提了。3GPP 的视频采用了 MPEG-4 H.263 两种编码,可能还将加入 H.264,音频方面音乐压缩采用 AAC,语音则采用先进的 AMR,另一个 aacPlus 随着 V2 版本的推出,底码率下的效果更加突出,也有望加入标准。

    Windows Media系列

    Microsoft 公司主导的音频视频编码系列,它的出现主要是为了进行网络视频传输,现在已经向 HDTV 方面进军,开发了 WMV HD 应用。

    • Microsoft MPEG-4 v1/v2/v3

    最早的 ASF 采用的视频编码,基于 MPEG-4 技术开发,DivX3.11 就是基于 Microsoft MPEG-4 v3 破解出来的,后来才进行了重写。

    • Windows Media Video 7

    Microsoft 正式开发的第一个 Windows Media Video,开始脱离了 MPEG-4,和 MPEG-4 不兼容,从这一点上可见微软的野心。可惜这个版本压缩效果非常烂,打破了微软一飞冲天的美梦,不过它在压缩速度上非常快,现在网络上有很多采用这种格式压缩的 WMV

    • Windows Media Video 8

    WMV7 基础上改进的版本,质量上面进不了不少。

    • Windows Media Video 9

    微软的重头戏,不光是这一个编码,V9 系列更是一个平台,让微软有足够的能力挑战 MPEGITU 等标准化组织。虽然这个版本并没有微软吹得那么厉害,特别是低码率下比较差,不过跟以前版本相比进步还是非常多的。特别是 WMV HD 的应用,让微软也跻身视频标准领域。

    • Windows Media Video 9 Professional

    WMV HD 应用的编码,和 WMV9 兼容,在高比特率上进行了优化,画面非常优秀。(不过几M的码率能不优秀吗?全是体积换来的。)

    • Windows Media Video 9 Advanced Profile

    随着 Windows Media Player 10 推出的编码器,能够更进一步控制 WMV9 的质量。但是不能在老版本的 WMP9 上播放,也就是不兼容老版本的 WMP9,真不知微软在搞什么?

    • Windows Media Video 9 Screen

    静态屏幕无损压缩编码,质量非常好,压缩率高,只针对如屏幕等变化非常小的环境。

    • Windows Media Video 9 Image

    静态图像压缩编码。

    • Windows Media Audio v1/v2

    微软最早的音频编码技术,用于 ASF 中,后来被破解也用在 DivX Audio 中,质量比较差。

    • Windows Media Audio 7/8/9

    随着各种不同的 WMV 而推出的相应的音频编码,质量节节提升,不过还没有达到 64kbps CD音质的神化。

    • Windows Media Audio 9 Professional

    WMA9 中出现的新编码,主要用于多声道编码和高采样率音频的编码,质量不错。

    • Windows Media Audio 9 Voice

    针对语音的编码,最高 20kbps ,不过和 AMR 相比,效果就太差了。

    • Windows Media Audio 9 Lossless

    无损音频编码,可以完美保留CD原质量,是CD备份的不错选择,不过代价是体积过大。

    RealMedia系列

    RealNetworks 所开发的系列编码技术,也是主要用于网络传输,在底码率下表现不错。

    • RealVideo G2

    早期的 RealVideo 编码,质量比较糟糕,不过那时在网络上算是很先进了,毕竟当时能用网络看视频的人不多。

    • RealVideo 8

    随着 RealPlayer 8 推出的视频格式,是现在主流的网络视频编码之一。编码速度较慢,质量也只能算一般。

    • RealVideo 9

    RealNetworks 开发的新一代编码,质量进步了很多,特别是在底码率下,而且编码速度很快,做到了速与质的很好统一。

    • RealVideo 10

    RealVideo 9 基础上加入了一些参数,如 EHQ 等,更加精确控制码率,和 RealVideo 9 兼容。

    • RealAudio Cook

    早期的音频编码,但是在现在看来,仍然质量不错,可惜最高码率 96kbps。应用到了两代音频编码中:RealAudio G2RealAudio 8

    • RealAudio Cook Multichannel

    Cook 的改进版本,增加了5.1声道的支持,应用到了 RealAudio 10 Multichannel 中。

    • RealAudio Sipro

    采用了 Sipro 语音编码技术,主要针对语音编码,应用在更早期的 RealAudio 4.0RealAudio 5.0 中。

    • RealAudio ATRAC3

    Sony 公司开发的 ATRAC3 编码,被 RealNetworks 公司购买过来应用到了 RealAudio 8 中,以弥补 Cook 高码率上的不足。

    • RealAudio AAC

    AAC 音频编码,用于 RealAudio 10 中。

    • RealAudio aacPlus

    aacPlus 音频编码,用于 RealAudio 10 中,不过并没有随 RealProducer 发行,需要单独购买。

    • RealAudio Lossless

    无损音频编码。

    QuickTime系列

    QuickTime 并不是一个编码,而是一个多媒体平台,它的上面有众多编码,这里只介绍几个主流的编码器。

    • Sorenson Video 2

    Sorenson Media 公司开发的编码器,主要用于 QuickTime 4 的视频编码,质量较差。

    • Sorenson Video 3

    Sorenson Media 公司随 QuickTime 5 发布的编码器,质量很不错,已经成为 QuickTime 的标准视频编码,网络上大部分电影预告片都采用这种编码。

    • Apple MPEG-4

    Apple 公司自己开发的 MPEG-4 编码器,随 QuickTime 6 发布,质量很差。

    • Apple H.264

    Apple 公司自己开发的 H.264 编码器,随 QuickTime 7 发布,支持 HDTV

    • QDesign Music 1

    QDesign 公司开发的音频编码器,这个版本现在已经开不到它的身影了。

    • QDesign Music 2

    QDesign Music 的第二个版本,也是最后一个版本,在时下这些先进的音频编码面前,它已经没有生命力了,主要应用于网上的电影预告片。

    • Qualcomm PureVoice

    Qualcomm

  • 转:C语言嵌入式系统编程修炼之软件架构篇

    2009-05-06 16:52:14

    模块划分

      模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的 部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到 了相对论),C语言模块化程序设计需理解如下概念:

      (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;

      (2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;

      (3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;

      (4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:

    /*module1.h*/
    int a = 5; /* 在模块1的.h文件中定义int a */

    /*module1 .c*/
    #include "module1.h" /* 在模块1中包含模块1的.h文件 */

    /*module2 .c*/
    #include "module1.h" /* 在模块2中包含模块1的.h文件 */

    /*module3 .c*/
    #include "module1.h" /* 在模块3中包含模块1的.h文件 */

      以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这个世界上从来不需要这样的程序。正确的做法是:

    /*module1.h*/
    extern int a; /* 在模块1的.h文件中声明int a */

    /*module1 .c*/
    #include "module1.h" /* 在模块1中包含模块1的.h文件 */
    int a = 5; /* 在模块1的.c文件中定义int a */

    /*module2 .c*/
    #include "module1.h" /* 在模块2中包含模块1的.h文件 */

    /*module3 .c*/
    #include "module1.h" /* 在模块3中包含模块1的.h文件 */

      这样如果模块1、2、3操作a的话,对应的是同一片内存单元。

      一个嵌入式系统通常包括两类模块:

      (1)硬件驱动模块,一种特定硬件对应一个模块;

      (2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。

      多任务还是单任务

      所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。

       多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。TCB包括任 务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务被激活时,要用到这些信息。此外,TCB还被用来存 放任务的"上下文"(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。通常,上下文就是计算机当前的状态,也即各个 寄存器的内容。当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。

      嵌入式多任务OS的典型例子有Vxworks、ucLinux等。嵌入式OS并非遥不可及的神坛之物,我们可以用不到1000行代码实现一个针对80186处理器的功能最简单的OS内核,作者正准备进行此项工作,希望能将心得贡献给大家。

      究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。
    单任务程序典型架构

      (1)从CPU复位时的指定地址开始执行;

      (2)跳转至汇编代码startup处执行;

      (3)跳转至用户主程序main执行,在main中完成:

      a.初试化各硬件设备;

      b.初始化各软件模块;

      c.进入死循环(无限循环),调用各模块的处理函数

      用户主程序和各模块的处理函数都以C语言完成。用户主程序最后都进入了一个死循环,其首选方案是:

    while(1)
    {
    }

      有的程序员这样写:

    for(;;)
    {
    }

      这个语法没有确切表达代码的含义,我们从for(;;)看不出什么,只有弄明白for(;;)在C语言中意味着无条件循环才明白其意。

      下面是几个"著名"的死循环:

      (1)操作系统是死循环;

      (2)WIN32程序是死循环;

      (3)嵌入式系统软件是死循环;

      (4)多线程程序的线程处理函数是死循环。

       你可能会辩驳,大声说:"凡事都不是绝对的,2、3、4都可以不是死循环"。Yes,you are right,但是你得不到鲜花和掌声。实际上,这是一个没有太大意义的牛角尖,因为这个世界从来不需要一个处理完几个消息就喊着要OS杀死它的WIN32 程序,不需要一个刚开始RUN就自行了断的嵌入式系统,不需要莫名其妙启动一个做一点事就干掉自己的线程。有时候,过于严谨制造的不是便利而是麻烦。君不 见,五层的TCP/IP协议栈超越严谨的ISO/OSI七层协议栈大行其道成为事实上的标准?

      经常有网友讨论:

    printf("%d,%d",++i,i++); /* 输出是什么?*/
    c = a+++b; /* c=? */

      等类似问题。面对这些问题,我们只能发出由衷的感慨:世界上还有很多有意义的事情等着我们去消化摄入的食物。

      实际上,嵌入式系统要运行到世界末日。

      中断服务程序

       中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。

      中断服务程序需要满足如下要求:

      (1)不能返回值;

      (2)不能向ISR传递参数;

      (3) ISR应该尽可能的短小精悍;

      (4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

      在某项目的开发中,我们设计了一个队列,在中断服务程序中,只是将中断类型添加入该队列中,在主程序的死循环中不断扫描中断队列是否有中断,有则取出队列中的第一个中断类型,进行相应处理。

    /* 存放中断的队列 */
    typedef struct tagIntQueue
    {
     int intType; /* 中断类型 */
     struct tagIntQueue *next;
    }IntQueue;

    IntQueue lpIntQueueHead;

    __interrupt ISRexample ()
    {
     int intType;
     intType = GetSystemType();
     QueueAddTail(lpIntQueueHead, intType);/* 在队列尾加入新的中断 */
    }

      在主程序循环中判断是否有中断:

    While(1)
    {
     If( !IsIntQueueEmpty() )
     {
      intType = GetFirstInt();
      switch(intType) /* 是不是很象WIN32程序的消息解析函数? */
      {
       /* 对,我们的中断类型解析很类似于消息驱动 */
       case xxx: /* 我们称其为"中断驱动"吧? */
        …
        break;
       case xxx:
        …
        break;
       …
      }
     }
    }

      按上述方法设计的中断服务程序很小,实际的工作都交由主程序执行了。
    硬件驱动模块

      一个硬件驱动模块通常应包括如下函数:

      (1)中断服务程序ISR

      (2)硬件初始化

      a.修改寄存器,设置硬件参数(如UART应设置其波特率,AD/DA设备应设置其采样速率等);

      b.将中断服务程序入口地址写入中断向量表:

    /* 设置中断向量表 */
    m_myPtr = make_far_pointer(0l); /* 返回void far型指针void far * */
    m_myPtr += ITYPE_UART; /* ITYPE_UART: uart中断服务程序 */
    /* 相对于中断向量表首地址的偏移 */
    *m_myPtr = &UART _Isr; /* UART _Isr:UART的中断服务程序 */

      (3)设置CPU针对该硬件的控制线

      a.如果控制线可作PIO(可编程I/O)和控制信号用,则设置CPU内部对应寄存器使其作为控制信号;

      b.设置CPU内部的针对该设备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。

      (4)提供一系列针对该设备的操作接口函数。例如,对于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提供获取时间、设置时间等函数。

      C的面向对象化

      在面向对象的语言里面,出现了类的概念。类是对特定数据的特定操作的集合体。类包含了两个范畴:数据和操作。而C语言中的struct仅仅是数据的集合,我们可以利用函数指针将struct模拟为一个包含数据和操作的"类"。下面的C程序模拟了一个最简单的"类":

    #ifndef C_Class
    #define C_Class struct
    #endif
    C_Class A
    {
     C_Class A *A_this; /* this指针 */
     void (*Foo)(C_Class A *A_this); /* 行为:函数指针 */
     int a; /* 数据 */
     int b;
    };

       我们可以利用C语言模拟出面向对象的三个特性:封装、继承和多态,但是更多的时候,我们只是需要将数据与行为封装以解决软件结构混乱的问题。C模拟面向 对象思想的目的不在于模拟行为本身,而在于解决某些情况下使用C语言编程时程序整体框架结构分散、数据和函数脱节的问题。我们在后续章节会看到这样的例 子。

      总结

      本篇介绍了嵌入式系统编程软件架构方面的知识,主要包括模块划分、多任务还是单任务选取、单任务程序典型架构、中断服务程序、硬件驱动模块设计等,从宏观上给出了一个嵌入式系统软件所包含的主要元素。

      请记住:软件结构是软件的灵魂!结构混乱的程序面目可憎,调试、测试、维护、升级都极度困难。
  • 转:几个重要的基础课程

    2009-05-06 16:50:22

      如果你是学生,或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目,这些书应该都还可以在书店买到。说实在的,我在读其他人的文章时最大的心愿就是希望作者列出一个书单。

     

        大学英语-不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来,而现在的许多 出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材,开始会看不懂,用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。

     

        计算机体系结构和汇编语言-关于体系结构的书遍地都是,而且也大同小异,倒是汇编有一本非常好的书《80x86汇编语言程序设计教程》(清 华大学出版社,黑色封面,杨季文著)。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。

     

        计算机操作系统原理-我们的开发总是在特定的操作系统上进行,如果不是,只有一种可能:你在自己实现一个操作系统。无论如何,操作系统原理 是必读的。这就象我们为一个芯片制作外围设备时,芯片基本的工作时序是必需了解的。这一类书也很多,我没有发现哪一本书非常出众。只是觉得在看完了这些书 后如果有空就应该看看《Inside Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000 技术内幕之类吧)。关于学习它的必要性,ZDNET上的另一篇文章已经有过论述。

     

        数据结构和算法-这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱战立,刘天时)。很多人喜欢买C++ 版的,但我觉得没有必要。C++的语法让算法实现过程变得复杂多了,而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览 一下 C++的版的书是最好的。

     

        软件工程-这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》(黄色,清华)。不 要花太多的时间去记条条框框,看不懂就跳过去。在每次自己完成了一个软件设计任务(不管是练习还是工作)以后再来回顾回顾,每次都会有收获。

     

        Windows 程序设计-《北京大学出版社,Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。在这本书中,没有C++,没有GUI,没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以后,你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC,你最好碰都不要碰。我知道的许多名校甚至都已经 用它作为教材进行授课。可见其重要。

  • 转:大量英文原版电子书下载的好地方

    2009-05-06 16:42:50

  • 转载:如何在Ubuntu下监视硬盘状态

    2009-03-06 12:34:41

    现在的硬盘大都有SMART功能,SMART是Self Monitoring Analysis And Reporting Technology的缩写,但是要启动SMART功能就需要在BIOS中开启,开启了之后就可以用各种SMART工具来检测硬盘状态,在Ubuntu下当然也有不少SMART工具,比如smartctl,这需要安装smartmontools包:

    $sudo apt-get install smartmontools

    安装完成之后就可以使用smartctl命令查看硬盘的基础情况:

    $sudo smartctl –i /dev/sda //如果是IDE硬盘则就是hda

    将返回第一块SATA(或SCSI)硬盘的SMART基础信息,如下所示:

    Screenshot-smartctl

    我们可以看到硬盘型号、序列号、固件版本、SMART功能是否支持和已开启等,这样子的使用和界面只有纯文本,可读性不如图形界面,要获得更更多信息需要使用更多参数,于是有人基于smartctl写了一个GNOME图形界面的应用程序,叫做GSmartControl,使用这个图形工具可以帮助我们更好的获得硬盘SMART信息。

    GSmartControl尚未加入Ubuntu源中,我们需要下载作者已打包好的Deb包:http://www.getdeb.net/app/GSmartControl

    安装Deb包可以在GNOME下直接双击也可以使用dpkg -i命令来安装,安装好之后可以在“应用程序” –> “系统工具”下看到“GSmartControl”,启动这个之后会看到已识别出的硬盘列表,如下图所示:

    Screenshot-GSmartControl1

    双击欲查看SMART信息的硬盘图标,将会弹出一个更大的对话框显示着SMART基础信息:

    Screenshot-GSmartControl2

    在这里单击“另存为”将把整个SMART监测信息输出文本文件。单击Attributes标签卡将显示该硬盘更多SMART信息,例如“通电次数”等:

    Screenshot-GSmartControl3

    在“Perform. Tests”标签卡下可以对硬盘进行不同类型的测试:

    Screenshot-GSmartControl4

    在这里的测试便可以得到硬盘的基本状况,有了smartmontools加上这个GSmartControl就相当于Ubuntu下的HD Tune(Windows下的硬盘检测工具,同样适用了SMART技术)。

    链接:http://ubuntu.osgeeker.com/2009/02/ubuntu_09.html

  • 转载:在Ubuntu下浏览CHM文件的4个方法

    2009-03-04 10:50:44

    转载:在Ubuntu下浏览CHM文件的4个方法
    链接:http://ubuntu.osgeeker.com/2009/02/ubuntuchm4.html
    CHM(Compiled Help Manual)是微软自有的说明文件格式,内部基于HTML驱动,常常被当作帮助文档来制作,比如微软的MSDN,也有不少小说、电子书是基于CHM制作(欲了解更多关于CHM请访问维基条目:CHM、HTML Help)。那么在Ubuntu下如何来浏览这种微软的文件格式呢,这里有4个方法:

    1、Gnochm

    Gnochm是基于GNOME的CHM阅读器,有如下特性:

    支持MS自有超链接
    支持完整文本搜索
    支持书签
    支持配置HTTP超链接
    与GNOME2紧密集成
    支持多语言
    支持同时打开多文件

    CHM阅读器

    安装Gnochm:

    $sudo apt-get install gnochm


    或者在Ubuntu下的Firefox浏览器中单击按钮安装:点击安装

    2、kchmviewer

    如果你在Ubuntu下安装了KDE桌面环境,那么你应该用与KDE桌面更和谐的CHM阅读器,叫做kchm viewer(下图是kchmviewer运行在GNOME桌面环境的截图):

    kchm viewer

    安装kchmviewer:

    $sudo apt-get install kchmviewer

    或者在Ubuntu下的Firefox浏览器中单击按钮安装:点击安装

    3、xCHM

    GNOME和KDE都有最和谐的版本,这个x开头的应该很容易联想到xfce这个桌面环境,没错xCHM没有特别局限适合哪个桌面环境,但是最棒的是还兼容fvwm或xfce,对于那些轻量级桌面癖的人而言xCHM是最合适的。

    xCHM

    安装xCHM:

    $sudo apt-get install xchm

    或者在Ubuntu下的Firefox浏览器中单击按钮安装:点击安装

    4、Mozilla Firefox扩展之CHM Reader

    啥都不想安装?那就用Firefox的扩展来实现CHM阅读功能好了:

    https://addons.mozilla.org/zh-CN/firefox/addon/3235

  • 人性的经典总结54句

    2009-02-26 12:45:06

    1、一个人炫耀什么,说明内心缺少什么。

    2、一个人越在意的地方,就是最令他自卑的地方。

    3、人都有以第一印象定好坏的习惯,认为一个人好时,就会爱屋及乌,认为一个人不好时,就会全盘否认。

    4、人越是得意的事情,越爱隐藏,越是痛苦的事情越爱小题大作。

    5、这个世界既不是有钱人的世界,也不是有权人的世界,它是有心人的世界。

    6、婚姻的杀手有时不是外遇,而是时间。

    7、当你再也没有什么可以失去的时候,就是你开始得到的时候。

    8、学习要加,骄傲要减,机会要乘,懒惰要除。

    9、童年的无知可爱,少年的无知可笑;青年的无知可怜;中年的无知可叹,老年的无知可悲。

    10、人允许一个陌生人的发迹,却不能容忍一个身边人的晋升。因为同一层次的人之间存在着对比、利益的冲突,而与陌生人不存在这方面的问题。

    11、一个女人喜欢一个男人时,她希望听到谎言;当一个女人厌恶一个男人时,她希望听到真理。

    12、如果你借太多的钱给一个人,你会令此人变成坏人。

    13、现代的婚姻是情感的产物,更是竞争的结晶。

    14、敌人变成战友多半是为了生存,战友变成敌人多半是为了金钱。

    15、有所得是低级快乐,有所求是高级快乐。

    16、天才失败了就是蠢才!

    17、世界上1%的人是吃小亏而占大便宜,而99%的人是占小便宜吃大亏。大多数成功人士都源于那1%。

    18、人如果靠吃饭活着,那饭不叫饭,叫饲料。

    19、中国人学美国人容易,中国人学中国人难。

    20、一个人幸运的前提,其实是他有能力改变自己。

    21、人的成长要接受四个方面的教育:父母、老师、书籍,社会。有趣的是,后者似乎总是与前面三种背道而驰。

    22、经营自己的长处,能使你人生增值;经营你的短处,能使你人生贬值。

    23、生命犹如一片绿叶,随着时间的流逝,慢慢变的枯黄,但他的叶脉还是那么清晰可见。

    24、把事情变复杂很简单,把事情变简单很复杂。

    25、如果是棵小草,即使在最好的企业里,你也长不成大树。果真如此,不如历经风雨,把自己培养成名贵花卉。

    26、二十一世纪工作生存法则就是:建立个人品牌,把你的名字变成钱。

    27、怕爹是孝顺,怕老婆是爱情。

    28、没有不合格的学生,只有不合格的家长。

    29、地球是运动的,一个人不会永远处在倒霉的位置。

    30、我们可以躲开大家,却躲不开一只苍蝇。生活中使我们不快乐的常是一些芝麻小事。

    31、有一种人只做两件事:你成功了,他妒嫉你;你失败了,他笑话你。

    32、笨男人+笨女人=结婚;笨男人+聪明女人=离婚;聪明男人+笨女人=婚外情;聪明男人+聪明女人=浪漫爱情。

    33、任何一个傻瓜都会引诱一个姑娘;但是知道怎样离开她只有成熟男人才能做到。

    34、人有两只眼睛,全是平行的,所以应当平等看人;人的两只耳朵是分在两边的,所以不可偏听一面之词;人虽只有一颗心,然而有左右两个心房,所以做事不但要为自己想,也要为别人想。

    35、企业一定要有偷不去、买不来、拆不开、带不走,溜不掉的独特资源。

    36、失言就是一不小心说了实话。

    37、真诚并不意味着要指责别人的缺点,但意味着一定不恭维别人的缺点。

    38、人的本性就是贪婪,但没有贪婪社会就不会进步。

    39、恋爱是想一个人的心,婚姻是拴一个人的心,爱情是吞一个人的心。

    40、最好的进攻就是进攻自己。

    41、人生的意义不在于拿一手好牌,而在于打好一手坏牌。

    42、成功是一种观念,致富是一种义务,快乐是一种权利。

    43、竞争,其实就是一种友谊,在对手的帮助下提高你的聪明度,害怕竞争的人已经输给了对手。

    44、钱可以帮穷人解决问题,却帮富人制造问题。

    45、把爱情投资在一个人身上,冒险;把爱情投资在许多人身上,危险。

    46、世界上只有想不通的人,没有走不通的路。

    47、真正的财富是一种思维方式,而不是一个月收入数字。

    48、一个人想平庸,阻拦者很少;一个人想出众,阻拦者很多。不少平庸者与周围人关系融洽,不少出众者与周围人关系紧张。

    49、婚后的男女莫不“喜出”“望外”。

    50、三流的化妆是脸上的化妆;二流的化妆是精神的化妆;一流的化妆是生命的化妆。

    51、“危机”两个字,一个意味着危险,另外一个意味着机会,不要放弃任何一次努力。

    52、是英雄表现出来,是人才体现出来,是蠢才显现出来。

    53、“总”要为爱人着想,“经”得起爱人唠叨,“理”应对爱人谦让,男人应当“总经理”。

    54、三人行,必有我师, 三剑客,必有一强, 三角恋,必有一伤
  • 比尔.盖茨给职场新人的10句话

    2009-02-26 12:42:05

    1.人生是不公平的,习惯去接受它吧。

    2.这个世界不会在乎你的自尊,这个世界期望你先做出成绩,再去强调自己的感受。

    3.你不会一离开学校就有百万年薪,你不会马上就是拥有移动电话的副总裁,两者你都必须靠努力赚来。

    4.如果你觉得你的老板很凶,等你当了老板就知道了,老板是没有工作任期保障的。

    5.在速食店煎个汉堡并不是作贱自己,你的祖父母对煎汉堡有完全不同的定义。

    6.如果你一事无成,不是你父母的错,所以不要只会对自己犯的错发牢骚,从错误中去学习。

    7.在你出生前,你的父母并不像现在这般无趣,他们变成这样是因为忙着付你的开销,洗你的衣服,听你吹嘘自己有多了不起,所以在你拯救被父母这代人破坏的热带雨林前,先整理一下自己的房间吧。

    8.在学校里可能有赢家和输家,在人生中却还言之过早,学校可能会不断给你机会找到正确的答案,真实人生中却完全不是这么回事。

    9.人生不是学期制,人生没有寒假,没有哪个雇主有兴趣协助你寻找自我,请用自己的空暇做这件事吧。

    10.电视上演的并不是真实的人生,真实人生中每个人都要离开咖啡厅去上班。
482/3<123>
Open Toolbar