Posted in C&C++, 计算机技术 on 九 27th, 2007
利用MFC进行编程时,我们从对话框中利用GetWindowText得到的字符串是CString类型,CString是属于MFC的类。而一些标准C/C++库函数是不能直接对CString类型进行操作的,所以我们经常遇到将CString类型转化char*等等其他数据类型的情况。这里总结备忘于此!
首先要明确,标准C中是不存在string类型的,string是标准C++扩充字符串操作的一个类。但是我们知道标准C中有string.h这个头文件,这里要区分清楚,此string非彼string。string.h这个头文件中定义了一些我们经常用到的操作字符串的函数,如:strcpy、strcat、strcmp等等,但是这些函数的操作对象都是char*指向的字符串。 而C++的string类操作对象是string类型字符串,该类重装了一些运算符,添加了一些字符串操作成员函数,使得操作字符串更加方便。有的时候我们要将string串和char*串配合使用,所以也会涉及到这两个类型的转化问题。
1.CString和string的转化
string str=”ksarea”;
CString cstr(str.c_str());//或者CString cstr(str.data());初始化时才行
cstr=str.c_str();或者cstr=str.data();
str=cstr.GetBuffer(0); //CString -> string
cstr.format(“%s”, str.c_str()); //string->CString
cstr.format(“%s”, str.data()); //string->CString
str = LPCSTR(cstr); //CString->string
/*c_str()和data()区别是:前者返回带’\0′的字符串,后者则返回不带’\0′的字符串*/
2.CString和int的转换
int i=123;
CString str;
str.format(“%d”,i);//int->CString 其他的基本类型转化类似
i=atoi(str);//CString->int 还有(atof,atol)
3.char*和CString的转换
CString cstr=”ksarea”;
char* ptemp=cstr.getbuffer(0);
char* str;
strcpy(str,ptemp);//CString->char*
cstr.releasebuffer(-1);
char*str=”lovesha”;
CString cstr=str;//char*->CString string类型不能直接赋值给CString
至于int与float、string与char*之间的转化可以使用强制转化,或者标准库函数进行。对于CString与其他类型的转化方法很多,但其实都殊途同归,朝着一个方向即将类型首先转化为char*类型,因为char*是不同类型之间的桥梁。得到char*类型,转化为其他类型就非常容易了。
Read Full Post »
Posted in IT闲聊 on 九 20th, 2007
经济的发展促使着人们不断的提高安防意识,当传统的本地模拟监控方式逐渐不能满足某些行业大范围、远距离监控的需求,如银行跨地区联网监控时,通过网络将图像进行远程传输的集中监控方式应运而生。目前,随着互联网的大范围普及,远程监控已经渗透到教育、政府、娱乐场所、医院、酒店、运动场馆、城市治安等多种领域。
熟悉远程监控的人都知道,将图像摄取后进行远程传输的主要方式除了互联网,还有光纤。有人认为,通过光端机和光纤进行远程监控,其视频图像的质量和传输速度要优于网络传输,但是它昂贵的成本和复杂的布线工程让人望而却步。更重要的是,其组网能力相对较差,不能满足大型监控项目的需求。而网络监控则在此显示出它独有的优势:凡是有网络的地方就能构建网络监控系统。由于省去了传统的布线和线路维护费用,使得网络监控系统的安装成本大大降低。对于使用者来说,网络监控还不受时间、地点限制,在授权的情况下可以随时按需监控,实现即插即用即看,使用方式相当便捷。于是,IP网络监控一致被业界认为是未来视频联网监控的主要趋势。网络监控的优势和广阔前景促使国内外安防厂商纷纷研发适合网络监控的产品,如先前的DVR,后来的网络摄像机、视频服务器等。这些网络产品由于采用了先进的数字压缩技术,可使传输带宽和存储要求达到更小化,以弥补因网络带宽不足而导致的缺陷。近年来,数字视频监控系统的核心设备——网络摄像机和视频服务器因为具有更多的智能特性和强大的联网功能,而成为网络监控市场的新宠儿。
Read Full Post »
Posted in Linux相关 on 九 13th, 2007
set函数:
为了将符号flowers的值设置为列表(rose violet daisy buttercup),我们在emacs中使用如下列表:
(set ‘flowers ‘(rose violet daisy buttercup));例一
光标置于表达式之后,键入C-x C-e或者C-x-e,列表(rose violet daisy buttercup)将会出现在回显区。这是set函数的返回值,每个Lisp函数如果不产生错误消息,它将必须有一个返回值作为附带效果,而函数的附带效果有且仅有一个附带效果。
我们已经为符号flowers赋值,那么我们可以对它进行求值:
flowers
光标置于它之后,键入C-x C-e或者C-x-e,回显区将显示列表(rose violet daisy buttercup)。我们也可以将flowers的值以字符串形式输出,这里使用到函数message:
(message “%s” flowers);有点类似C语言里的printf
同样键入C-x C-e或者C-x-e,回显区将以字符串“(rose violet daisy buttercup)”的形式显示flowers的值。
这里还要说明注意一下,为什么set函数的两个参量之前都用了一个单引号?Lisp解释器是由内层列表往外层列表进行解释的,所以执行函数时,首先要对参量进行解释或者求值。而单引号位于列表或者变量之前,是为了告诉Lisp解释器不要对这个列表和变量进行求值操作。试想,如果例一中没有在两个参量前面添加一个单引号,那么在执行set函数之前首先要对flowers进行求值,而flowers此时是没有值的,自然要报错,而且如果列表(rose violet daisy buttercup)前面没有单引号,Lisp解释器会将列表中的第一个符号rose理解成要执行的命令即函数,但是没有帮定在符号rose上的函数,所以执行也要报错。但是如果有的参量值确实是可以求得的,那么还是可以不加单引号的:
(set ‘flowers (+ 2 2));flowers的值将被赋予4
setq函数:
这个函数其实是set函数的一个扩充,因为在大多数情况下我们总是会在set函数的第一个参量前加单引号。既然set函数和其第一个带单引号的参量的组合如此常见,所以就产生了一个特殊的函数:setq(set+quote)。这个函数和set函数的功能类似,不同的是setq函数在执行的时候自动的在其第一个参量前带上单引号,而不必自己键入单引号。
所以下面两个列表执行结果是一致的:
(set ‘flowers ‘(rose violet daisy buttercup))
(setq flowers ‘(rose violet daisy buttercup))
当然,setq还被赋予了一个新的功能,给几个不同的变量赋予不同的值,如:
(setq flowers ‘(rose violet daisy buttercup) trees ‘(pine fir oak maple))
上述列表是将第一个参量指向第二个参量列表(赋值),第三个参量指向第四个参量列表(赋值)。
利用setq,我们可以实现一个简单的计数器:
(setq counter 0);初始化counter的值为0
(setq counter (+ counter [...]
Read Full Post »
Posted in Video Coding on 九 6th, 2007
最近整理了很多有关国际安防监控应用的项目情况,特别是基于可伸缩视频编码的。感觉有关智能安防这一块需要继续学习的东西还有很多很多……平时一直都是在做适于安防视频压缩的技术研究工作,现在在网上搜一搜,才发现以前学习的那一块只是很小的一部分。想要了解一个领域的整体发展情况,不光要知道与其有关的技术知识,还包括它的发展历程、发展现状和未来的发展方向。就是说不光要对某一项或某一点弄精,还要知全局,这样才能不断的扩宽自己的知识面。不然,以后在同行面前调侃都没有词的,呵呵……把最近整理的有关visiowave公司的文章发一篇到这里贴一下吧。
VisioWave公司是一家在智能视频安防领域居于世界领先地位的厂商,专注于数字图像处理和传输,设计建立了一套优秀的智能视频安防系统的体系架构,并围绕着这套优秀的体系架构开发出了相应的软硬件产品。视频监控系统智能化的前提条件是网络化和数字化。 VisioWave的解决方案就是完全构架在网络之上的,彻底摆脱了传统视频监控系统,甚至是普通产品的限制,视频流可以在整个系统的范围内自由地被调度、使用和管理,具备了前所未有的灵活性。智能视频监控系统对视频图像的数字化也提出了全新的要求。目前数字监控产品普遍采用了针对媒体市场开发的视频压缩标准,但是由于不具备可伸缩性,这类视频压缩标准恰恰不适合应用在视频监控领域,例如在大屏幕上监看需要很好的图像质量,进行自动图像分析却只需要较低质量的图像,这就要求视频压缩算法具备可伸缩性,即一个编码器能同时输出不同分辨率、不同帧率的视频流或者一路视频流可以同时被解码为不同分辨率、不同帧率的图像,否则就需要消耗巨大的计算能力、网络资源和存储空间才能实现上述功能,从而导致系统造价大幅上扬,客户难以承受。
Read Full Post »
Posted in Linux相关 on 九 4th, 2007
刚装上ubuntu当然要学习下软件安装方法。Linux下任何文件都具有可执行的属性,即使是我们熟悉的文本文件,所以它的软件安装不像Windows下双击exe可执行文件那么简单。安装都是使用package来进行的。作为新手,开始真的被终端下的rpm/apt/dpkg弄糊涂了,只是知道他们都可以用来安装软件,但是不知道他们到底有什么区别。
终端下输入如下命令:
man rpm
man dpkg
man apt
将manual page的查询结果对比一下,区别还是很明显。rpm,dpkg都是 package manager,都是操作软件包文件的主要工具,管理着从网上下载下来的软件的安装,卸载以及更新等操作,它们的区别只是前者是RedHat支持的包管理器,处理的扩展名是.rpm,而后者是debian支持的包管理器,处理的扩展名是.deb。所以在不同的Linux系统中,我们可以使用rpm或是dpkg不同的命令参数来安装软件,但它们不会考虑软件包的相依性问题。Ubuntu是基于Debian的,所以它是利用dpkg来管理软件包的。虽然我们不推荐在ubuntu下安装rpm包,但我们还是可以安装扩展名为.rpm的包的。方法如下:
1.装个将rpm包转换为deb包的小工具alien
apt-get install alien
2.进入rpm所在的目录,输入命令
alien *.rpm
这样就生成Ubuntu支持的*.deb
3.最后使用dpkg进行安装
sudo dpkg -i *.deb
而apt是 management system for software packages,我觉得它和Ubuntu里的新立德软件包管理器类似,它是自动下载软件源里的软件,然后调用dpkg来进行安装以及其他操作。不同的是APT是利用终端命令工作的:
sudo apt-get install package
当然我们还可以进行其他的命令进行维护。它的好处以及其他应用具体见APT介绍和使用。
Read Full Post »
Posted in Linux相关, 计算机技术 on 九 2nd, 2007
APT(Advanced Package Tool)是 Debian GNU/Linux 用来管理套件的工具,Conectiva 这家巴西的 Linux 套件公司将它移植到使用 RPM 系统的 Linux 套件上,們可以用 APT 来管理我們的 RPM ,不管是安装、移除、或是升級,APT 都做的到,可是我们选用 APT 最大的理由是:它能够自动处理 RPM 相依性的问题,例如:当我们要安装 A rpm,而 A rpm 和 B rpm 又有相依关系的时候,传统作法是先下载 B rpm 安装之后,再下载 A rpm 安装之;可是我们若有安装APT,则只要下一行「apt-get install A」指令就可以了,这样 APT 就会帮我们下载 A rpm,且会自动下载相依性档案(B rpm)帮我们安装,如此一來我们对于 RPM 的安装、移除、或是升級都可以不用去管相依性问题了。
上述的RPM全称是Red Hat Package Manager(Red Hat包管理器)。RPM本质上就是一个包,包含可以立即在特定机器体系结构上安装和运行的Linux软件。这里顺便说说Linux软件扩展名。软件后缀为.rpm 最初是Red Hat Linux提供的一种包封装格式,现在许多Linux发行版本都使用;后缀为.deb是Debain Linux提供的一种包封装格式;后缀为.tar.gz、tar.Z、tar.bz2或.tgz是使用Unix系统打包工具tar打包的;后缀为.bin 的一般是一些商业软件。通过扩展名可以了解软件格式,进而了解软件安装。
Apt 使用参考
命令 [...]
Read Full Post »