常用数据类型转换使用详解
- 格式:doc
- 大小:9.76 KB
- 文档页数:8
一.VC常用数据类型列表二.常用数据类型转化2.1数学类型变量与字符串相互转换_ttoi(CString->int) _tstof(CString->double)2.2CString及string,char *与其他数据类型的转换和操作●CString,string,char*的综合比较●数学类型与CString相互转化●CString与char*相互转换举例●CString 与 BSTR 型转换●VARIANT 型转化成 CString 型2.3 BSTR、_bstr_t与CComBSTR2.4 VARIANT 、_variant_t 与 COleVariant附录CString及字符串转及操作详解参考书籍:CSDN,<<MFC深入浅出(Second Edit)>> 一.VC常用数据类型列表int iTyep=3;char *szChar;itoa(iType,szChar,2);cout<<szChar;//输出为1010类似函数列表:_CRTIMP char * __cdecl _itoa(int, char *, int);//为了完整性,也列在其中_CRTIMP char * __cdecl _ultoa(unsigned long, char *, int);_CRTIMP char * __cdecl _ltoa(long, char *, int);_CRTIMP char * __cdecl _i64toa(__int64, char *, int);_CRTIMP char * __cdecl _ui64toa(unsigned __int6 4, char *, int);_CRTIMP wchar_t * __cdecl _i64tow(__int64, wchar_t *, int);_CRTIMP wchar_t * __cdecl _ui64tow(unsigned __int64, wchar_t *, int);_CRTIMP wchar_t * __cdecl _itow (int, wc har_t *, int);//转换为长字符串类型_CRTIMP wchar_t * __cdecl _ltow (long, wchar_t *, int);_CR TIMP wchar_t * __cdecl _ultow (unsigned long, wchar_t *, int);还有很多,请自行研究(2)将字符串类型转换为数学类型变量可以用以下一些函数:举例: _CRTIMP int __cdecl atoi(co nst char *);//参数一看就很明了char *szChar=”88”;int temp(0);temp=atoi(szChar); cout<<temp;类似的函数列表:_CRTIMP int __cdecl atoi(const char *);_CRTIMP double __cd ecl atof(const char *);_CRTIMP long __cdecl atol(const char *);_CRTIMP long double __cdecl _atold(const char *);_CRTIMP __int64 __cdecl _atoi64(const char *);_CRTIMP double __cdecl s trtod(const char *, char **);//_CRTIMP long __cdecl strtol(const char *, char **, int);//_ CRTIMP long double __cdecl _strtold(const char *, char **);_CRTIMP unsigned long __cdecl str toul(const char *, char **, int);_CRTIMP double __cdecl wcstod(const wchar_t *, wchar_t **); //长字符串类型转换为数学类型_CRTIMP long __cdecl wcstol(const wchar_t *, wchar_t **, int); _CRTIMP unsigned long __cdecl wcstoul(const wchar_t *, wchar_t **, int);_CRTIMP int __cdecl _wtoi(const wchar_t *);_CRTIMP long __cdecl _wtol(const wchar_t *);_CRTIMP __int64 __cdecl _wtoi64(const wchar_t *);还有很多,请自行研究2.2.CString及string,char *与其他数据类型的转换和操作(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章<< CString,string,char*的综合比较>>写的很详细,请大家在仔细阅读他的文章.地址: /joise/或参考附录:(2)转换:●数学类型与CString相互转化数学类型转化为CString可用Format函数,举例:CString s;int i = 64;s.Format("%d", i)CString转换为数学类型:举例CString strValue("1.234");double dblValue;dblValue = atof((LPCTSTR)strValue);●CString与char*相互转换举例CString strValue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)对CString// 进行强制转换.szValue=(LPSTR)(LPCTSTR)strValue;反过来可直接赋值:char *szChar=NULL;CString strValue;szChar=new char[10];memset(szChar,0,10);strcpy(szChar,”Hello”);strValue=szChar;●CString 与 BSTR 型转换CString 型转化成 BSTR 型当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成 BSTR 类型.B STR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的 NULL 字符。
表的读取与解析技巧在数据处理和数据分析的领域中,表格是一种常见且重要的数据结构。
无论是在Excel、数据库还是在编程语言中创建的表格,掌握表的读取与解析技巧对于准确地获取和分析数据至关重要。
本文将介绍一些实用的表的读取与解析技巧,帮助您高效地处理表格数据。
一、读取表格数据读取表格数据是进行数据分析的第一步。
根据表格的不同形式和存储方式,我们可以采用多种方法进行数据读取:1. 在Excel中读取表格数据在Excel中读取表格数据是最常见的方法之一。
可以直接打开Excel 文件,然后选择想读取的工作表。
通过使用Excel提供的函数、筛选和排序功能,我们可以快速浏览和分析表格数据。
2. 使用数据库查询语言(SQL)读取表格数据如果数据存储在关系型数据库中,我们可以使用SQL语句来查询表格数据。
通过编写查询语句,我们可以选择特定的列、筛选特定的行,并对结果进行排序和聚合操作。
这样可以更精确地获取我们所需要的数据。
3. 使用编程语言读取表格数据当表格数据较大或需要进行复杂的数据处理时,使用编程语言可能更适合。
Python和R是两种常用的数据科学编程语言,它们提供了丰富的库和函数来读取和处理表格数据。
通过使用pandas库(Python)或者tidyverse包(R),我们可以轻松地将表格数据加载到内存中,并进行各种操作和分析。
二、解析表格数据在读取表格数据后,我们需要解析数据以便更好地理解和分析。
以下是一些常用的解析表格数据的技巧:1. 数据清洗与预处理表格数据通常需要进行清洗和预处理,以便去除无用信息、填充缺失值、处理异常值等。
我们可以使用数据处理工具或编程语言提供的函数来实现这些操作。
例如,使用Excel的筛选功能,我们可以快速选择和删除表格中的无用数据;使用Python中的pandas库,我们可以使用dropna()函数来删除包含缺失值的行或列。
2. 列与行操作在解析表格数据时,我们经常需要对表格的列和行进行操作。
BigDecimal的⽤法详解(保留两位⼩数,四舍五⼊,数字格式化,科学计数法转数字,数字。
转⾃:⼀、简介Java在java.math包中提供的API类BigDecimal,⽤来对超过16位有效位的数进⾏精确的运算。
双精度浮点型变量double可以处理16位有效数。
在实际应⽤中,需要对更⼤或者更⼩的数进⾏运算和处理。
float和double只能⽤来做科学计算或者是⼯程计算,在商业计算中要⽤java.math.BigDecimal。
BigDecimal所创建的是对象,我们不能使⽤传统的+、-、*、/等算术运算符直接对其对象进⾏数学运算,⽽必须调⽤其相对应的⽅法。
⽅法中的参数也必须是BigDecimal的对象。
构造器是类的特殊⽅法,专门⽤来创建对象,特别是带有参数的对象。
⼆、构造器描述BigDecimal(int) 创建⼀个具有参数所指定整数值的对象。
BigDecimal(double) 创建⼀个具有参数所指定双精度值的对象。
BigDecimal(long) 创建⼀个具有参数所指定长整数值的对象。
BigDecimal(String) 创建⼀个具有参数所指定以字符串表⽰的数值的对象。
三、⽅法描述add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
wpf converter参数WPF Converter参数详解在WPF(Windows Presentation Foundation)中,Converter (转换器)是一种非常常用的工具,它用于在XAML中对数据进行转换和格式化,以实现更好的数据展示效果。
在本文中,我们将详细介绍WPF Converter的参数及其使用方法,帮助读者更好地理解和使用这一功能。
一、什么是ConverterConverter是WPF中的一种特殊类,它实现了IValueConverter 接口,并通过实现其中的Convert和ConvertBack方法来完成数据的转换。
Convert方法用于将绑定的源数据转换为目标数据,而ConvertBack方法则用于将目标数据转换回源数据。
二、Converter的参数在WPF中,Converter的参数可以通过ConverterParameter属性进行设置。
该属性的类型为object,因此我们可以将任何类型的数据作为参数传递给Converter。
在使用ConverterParameter属性时,我们可以直接在XAML中设置参数的值,也可以通过绑定的方式动态设置参数。
三、如何使用Converter参数1. 直接在XAML中设置参数的值在XAML中使用Converter时,可以通过在ConverterParameter 属性中直接设置参数的值。
例如,我们有一个Converter用于将数字转换为对应的颜色,而这个颜色是由参数指定的,我们可以这样写:```xml<Window.Resources><local:ColorConverter x:Key="colorConverter" /></Window.Resources><TextBlock Text="123" Foreground="{Binding Path=Value, Converter={StaticResource colorConverter}, ConverterParameter=Red}" />```在这个例子中,我们将ConverterParameter设置为Red,表示将数字转换为红色。
listbymap用法ListByMap用法详解ListByMap是一种常用的Java集合类,它可以将Map中的键值对转换为List中的元素。
在实际开发中,我们经常需要将Map中的数据转换为List,以便于进行排序、过滤、分页等操作。
ListByMap 就是为了解决这个问题而设计的。
ListByMap的使用方法非常简单,只需要调用它的静态方法listByMap即可。
该方法接受一个Map类型的参数,返回一个List 类型的结果。
下面是一个简单的示例:```Map<String, Integer> map = new HashMap<>();map.put("apple", 10);map.put("banana", 20);map.put("orange", 30);List<Map.Entry<String, Integer>> list = ListByMap.listByMap(map); ```上面的代码中,我们创建了一个Map对象,并向其中添加了三个键值对。
然后调用ListByMap的listByMap方法,将Map对象转换为List对象。
最终得到的List对象中包含了三个Map.Entry类型的元素,每个元素表示一个键值对。
ListByMap的返回结果是一个List<Map.Entry<K, V>>类型的对象,其中K表示键的类型,V表示值的类型。
List中的元素是按照Map 中的键值对顺序排列的。
如果需要按照值的大小进行排序,可以使用Collections.sort方法进行排序。
ListByMap还支持过滤操作。
可以通过传递一个Predicate对象来过滤List中的元素。
下面是一个示例:```Map<String, Integer> map = new HashMap<>();map.put("apple", 10);map.put("banana", 20);map.put("orange", 30);List<Map.Entry<String, Integer>> list = ListByMap.listByMap(map, entry -> entry.getValue() > 15);```上面的代码中,我们创建了一个Map对象,并向其中添加了三个键值对。
《Java 字符串转 BufferedReader 方法详解》在Java编程中,字符串和缓冲读取器(BufferedReader)是两个常用的数据类型。
而将字符串转换为缓冲读取器是一项常见的操作,本文将深入探讨这一转换方法。
一、背景介绍1.1 字符串和缓冲读取器在Java中,字符串是一种不可变的数据类型,用于存储文本数据。
而缓冲读取器是用于读取文本数据的类,其提供了一些便捷的方法来读取字符、字符串和行。
在实际开发中,我们经常需要从字符串转换为缓冲读取器,以便对文本进行逐行读取或其他操作。
1.2 转换方法的重要性字符串到缓冲读取器的转换是Java编程中的常见需求,尤其是在处理文件读取、网络通信等方面。
了解并掌握这一转换方法对于编程人员非常重要。
二、转换方法探讨2.1 使用StringReader和BufferedReader在Java中,可以使用StringReader和BufferedReader两个类来实现字符串到缓冲读取器的转换。
我们需要将字符串包装成StringReader对象,然后再将StringReader对象包装成BufferedReader对象。
这样就可以将字符串转换为缓冲读取器,实现对文本的逐行读取等操作。
2.2 转换示例下面是一个简单的示例代码,演示了如何将字符串转换为缓冲读取器:```javaString s = "Hello, world!\nThis is a test.";StringReader stringReader = new StringReader(s); BufferedReader bufferedReader = newBufferedReader(stringReader);```通过上述代码,我们成功将字符串s转换为缓冲读取器bufferedReader,从而可以使用bufferedReader来逐行读取字符串内容。
2.3 转换方法的灵活性除了上述的基本转换方法外,Java还提供了一些其他的转换方式,比如使用InputStream、FileReader等。
str 用法STR 用法详解在计算机编程中,字符串(string)是一种非常重要和基本的数据类型,它由一串字符组成,可以用来存储文本、数字和其他数据。
在 Python这门编程语言中,字符串的表现形式为 str 类型。
在本文中,我们将详细介绍 str 在 Python 中的用法。
一、字符串的表示方法在Python 中,字符串可以用单引号(' )或双引号(" )表示。
例如:str1 = 'hello'str2 = "world"如果需要在字符串中包含单引号或双引号,可以使用转义字符( \ )来表示。
例如:str3 = 'I\'m a student.'str4 = "She said, \"Hello.\""同时,Python 也提供了三重引号( ''' 或 """ )来表示多行字符串。
例如:str5 = '''Hello,World!'''二、字符串的常用方法1. 字符串的拼接字符串拼接可以使用 + 或 * 运算符。
例如:str1 = 'hello'str2 = 'world'str3 = str1 + str2str4 = str1 * 32. 字符串的切片字符串切片可以用于取出字符串中的部分内容,其格式为:[start: end: step]。
其中,start 表示起始位置,如果不指定,默认为0;end 表示结束位置,如果不指定,默认为字符串的长度;step 表示步长,表示取值时每隔几个字符取一个。
例如:str1 = 'Hello, World!'print(str1[7:12]) # 输出 Worldprint(str1[::2]) # 输出 Hlo ol!3. 字符串的查找字符串的查找可以使用 find()、index() 和 count() 方法。
json.stringify原理-回复JSON.stringify原理及用法详解JSON.stringify是JavaScript中一个非常常用的方法,用于将一个JSON 对象转换为字符串。
该方法生成的字符串可以被服务器接收并解析,也可以被其他客户端程序进行传输和解析。
本文将详细解析JSON.stringify的原理及用法。
1. 什么是JSON在深入了解JSON.stringify之前,我们先要了解什么是JSON(JavaScript Object Notation)。
JSON是一种轻量级的数据交换格式,具有简洁清晰的结构,易于阅读和编写。
它常被用于前后端数据交互、配置文件等场景。
JSON的数据格式类似于JavaScript中的对象和数组,主要由键值对组成,键必须是字符串,值可以是字符串、数字、布尔、数组、对象或null等类型。
JSON的具体格式如下:{"key1": "value1","key2": "value2","key3": {"subkey": "subvalue"},"key4": ["item1", "item2"]}2. JSON.stringify的作用及用法JSON.stringify方法用于将一个JavaScript对象转换为一个JSON字符串。
它接受三个参数:value、replacer和space。
- value:要被转换为字符串的JavaScript对象。
- replacer(可选):用于控制转换过程的函数或数组。
可以过滤和转换对象的属性。
- space(可选):用于控制格式化输出的缩进空格数,或者指定一个字符串,用于缩进每个级别的输出。
下面是一个示例,展示了JSON.stringify的基本用法:javascriptconst obj = { name: "John", age: 30, city: "New York" };const jsonString = JSON.stringify(obj);console.log(jsonString);输出:{"name":"John","age":30,"city":"New York"}3. JSON.stringify的原理解析JSON.stringify的执行过程可以分为两个主要步骤:3.1 序列化序列化是将JavaScript对象转换为字符串的过程。
pb函数库之数据类型检查与转换函数(共5则范文)第一篇:pb函数库之数据类型检查与转换函数(共)pb函数库之数据类型检查与转换函数Asc()功能得到字符串第一个字符的ASCII码整数值。
语法Asc(string)参数string:要得到第一个字符ASCII值的字符串返回值Integer。
函数执行成功时返回string参数第一个字符的ASCII值,如果string 参数的值为NULL,则Asc()函数返回NULL。
Char()功能将字符串的第一个字符、Blob变量的第一个值、或一个整数转换成字符。
语法Char(n)参数n:字符串、Blob变量或整数,也可以是包含上述类型数据的Any类型变量返回值Char。
返回参数n的第一个字符。
如果n参数的值为NULL,则Char()函数返回NULL。
Dec()功能将字符串或Blob值转换成Decimal类型的值。
语法Dec(stringorblob)参数stringorblob:string类型变量或Blob类型变量。
Blob类型变量时,把该变量第一个值转换为Decimal类型的值,其余部分被忽略。
stringorblob参数也可以是包含上述类型数据的Any类型变量返回值Decimal。
函数执行成功时返回相应的Decimal类型值。
如果stringorblob参数中的值不是有效的PowerScript数字或数据类型不兼容,那么Dec()函数返回0。
如果stringorblob参数的值为NULL,则Dec()函数返回NULL。
Double()功能将字符串或Blob值转换成Double类型的值。
语法Double(stringorblob)参数stringorblob:string类型变量或Blob类型变量。
Blob类型变量时,把该变量第一个值转换为Double类型的值,其余部分被忽略。
stringorblob参数也可以是包含上述类型数据的Any类型变量返回值Double。
sqlserver类型转换整型函数
在SQL Server中,类型转换函数是一种能够将一种数据类型转换成另一种数据类型的功能。
其中,将各种数据类型转换为整型是很常见的操作。
在SQL Server中,有多种不同的类型转换函数可以完成此任务。
最常见的数据类型转换整型函数是CAST。
它可以将其他数据类型转换为整型,如CHAR、VARCHAR、DATETIME等。
只需要指定要转换的数据类型及转换后的整型,就可以使用该函数来完成类型转换。
此外,还有一种常用的类型转换整型函数,即CONVERT。
这个函数可以用来将各种数据类型转换为整型。
通过指定要转换的数据类型及转换后的整型,就可以实现数据类型转换。
另外,还有一种类型转换函数,用于将定义为NUMERIC的数据类型转换为整型。
这种函数叫做TRANSFORM,它可以将NUMERIC类型的数据转换为bigint、int、smallint或tinyint类型的整型数据。
总而言之,SQL Server提供了一系列的类型转换整型函数,可以将不同类型的数据转换为整型,从而提高工作效率。
因此,应该掌握这些函数的使用方法,以方便完成数据转换任务。
8⼤基本数据类型详解基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。
它们是我们编程中使⽤最频繁的类型。
java是⼀种强类型语⾔,第⼀次申明变量必须说明数据类型,第⼀次变量赋值称为变量的初始化。
扩展:新版Java11引⼊了⼀个全新的类型关键字var,⽤var来定义的变量不⽤写具体类型,编译器能根据=右边的实际赋值来⾃动推断出变量的类型:1. Java的简单类型及其封装器类Java基本类型共有⼋种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。
数值类型⼜可以分为整数类型byte、short、int、long和浮点数类型float、double。
JAVA中的数值类型不存在⽆符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变⽽改变。
实际上,JAVA中还存在另外⼀种基本类型void,它也有对应的包装类 ng.Void,不过我们⽆法直接对它们进⾏操作。
8 中类型表⽰范围如下:byte:8位,最⼤存储数据量是255,存放的数据范围是-128~127之间。
-2^7—2^7 -1 最⾼位为符号位,最⾼位为1代表负数,最⾼位为0代表正数。
最⼤值为:0111 1111,最⼩值为1000 0001。
short:16位,最⼤数据存储量是65536,数据范围是-32768~32767之间。
-2^15—2^15 -1int:32位,最⼤数据存储容量是2的32次⽅减1,数据范围是负的2的31次⽅到正的2的31次⽅减1。
long:64位,最⼤数据存储容量是2的64次⽅减1,数据范围为负的2的63次⽅到正的2的63次⽅减1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
目录八进制十六进制八进制一种计数法,采用0,1,2,3,4,5,6,7八个数码,逢八进位,并且开头一定要以数字0开头。
八进制的数较二进制的数书写方便,常应用在电子计算机的计算中。
例如: 10进制的32表示成8进制就是:40 10进制的9,27在八进制中分别记位11,33. 8进制的32表示成10进制就是:3×8^1+2×8^0=26八进制简介八进制(基数为8)表示法在早期的计算机系统中很常见,因此,偶尔我们还能看到人们使用八进制表示法。
八进制适用于12位和36位计算机系统(或者其他位数为3的倍数的计算机系统)。
但是,对于位数为二的幂(8位,16位,32位与64位计算机系统)的计算机系统来说,八进制就不算很好了。
因此,在过去几十年里,八进制渐渐地淡出了。
不过,还是有一些程序设计语言提供了使用八进制符号来表示数字的能力,而且还是有一些比较古老的Unix应用在使用八进制。
八进制逢八进一,基数为八,基本符号:0、1、2、3、4、5、6、7。
位权8∧i。
表示符号:O八进制的转换二进制与八进制的互相转换和二进制与十六进制的转换类似,区别在于需要操作的是三位一组而不是四位。
表2-2列出了二进制与八进制的等效表示。
为了把八进制数换算为二进制,将每一个八进制数字替换成表2-2中对应的三位。
例如,八进制123q换算成二进制的结果就是%0_0101_0011:转换八进制化为十进制例:将八进制数12.6转换成十进制数(12.6)8 = 1×8 + 2×8 + 6×8 = (10.75)10八进制化为二进制规则:按照顺序,每1位八进制数改写成等值的3位二进制数,次序不变。
例:(17.36)8 = (001 111 .011 110)2 = (1111.01111)2 八进制化为十六进制先将八进制化为二进制,再将二进制化为十六进制。
例:(712)8 = (111001010)2 = (1CA)16转换为八进制二进制化为八进制整数部份从最低有效位开始,以3位一组,最高有效位不足3位时以0补齐,每一组均可转换成一个八进制的值,转换完毕就是八进制的整数。
目录八进制十六进制八进制一种计数法,采用0,1,2,3,4,5,6,7八个数码,逢八进位,并且开头一定要以数字0开头。
八进制的数较二进制的数书写方便,常应用在电子计算机的计算中。
例如: 10进制的32表示成8进制就是:40 10进制的9,27在八进制中分别记位11,33. 8进制的32表示成10进制就是:3×8^1+2×8^0=26八进制简介八进制(基数为8)表示法在早期的计算机系统中很常见,因此,偶尔我们还能看到人们使用八进制表示法。
八进制适用于12位和36位计算机系统(或者其他位数为3的倍数的计算机系统)。
但是,对于位数为二的幂(8位,16位,32位与64位计算机系统)的计算机系统来说,八进制就不算很好了。
因此,在过去几十年里,八进制渐渐地淡出了。
不过,还是有一些程序设计语言提供了使用八进制符号来表示数字的能力,而且还是有一些比较古老的Unix应用在使用八进制。
八进制逢八进一,基数为八,基本符号:0、1、2、3、4、5、6、7。
位权8∧i。
表示符号:O八进制的转换二进制与八进制的互相转换和二进制与十六进制的转换类似,区别在于需要操作的是三位一组而不是四位。
表2-2列出了二进制与八进制的等效表示。
为了把八进制数换算为二进制,将每一个八进制数字替换成表2-2中对应的三位。
例如,八进制123q换算成二进制的结果就是%0_0101_0011:转换八进制化为十进制例:将八进制数12.6转换成十进制数(12.6)8 = 1×8 + 2×8 + 6×8 = (10.75)10八进制化为二进制规则:按照顺序,每1位八进制数改写成等值的3位二进制数,次序不变。
例:(17.36)8 = (001 111 .011 110)2 = (1111.01111)2 八进制化为十六进制先将八进制化为二进制,再将二进制化为十六进制。
例:(712)8 = (111001010)2 = (1CA)16转换为八进制二进制化为八进制整数部份从最低有效位开始,以3位一组,最高有效位不足3位时以0补齐,每一组均可转换成一个八进制的值,转换完毕就是八进制的整数。
VC常用数据类型使用转换详解CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。
CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;vc++中各种字符串的表示法首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
LP的含义是长指针(long pointer)。
LPSTR是一个指向以‘/0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.2.C表示const3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
然后为了实现两种编码的通用,提出了TCHAR的定义:如果定义_UNICODE,声明如下:typedef wchar_t TCHAR;如果没有定义_UNICODE,则声明如下:typedef char TCHAR;LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。
LPCTSTR:#ifdef _UNICODEtypedef const wchar_t * LPCTSTR;#elsetypedef const char * LPCTSTR;#endifVC常用数据类型使用转换详解先定义一些常见类型变量借以说明int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username[]="女侠程佩君";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它数据类型转换为字符串短整型(int)itoa(i,temp,10); //将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); //按二进制方式转换长整型(long)ltoa(l,temp,10);二、从其它包含字符串的变量中获取指向该字符串的指针CString变量str = "2008北京奥运";buf = (LPSTR)(LPCTSTR)str;BSTR类型的_variant_t变量v1 = (_bstr_t)"程序员";buf = _com_util::ConvertBSTRToString((_bstr_t)v1);三、字符串转换为其它数据类型strcpy(temp,"123");短整型(int)i = atoi(temp);长整型(long)l = atol(temp);浮点(double)d = atof(temp);四、其它数据类型转换到CString使用CString的成员函数Format来转换,例如:整数(int)str.Format("%d",i);浮点数(float)str.Format("%f",i);字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值str = username;五、BSTR、_bstr_t与CComBSTRCComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据"); //使用前需要加上头文件comutil.h反之可以使用char *p=_com_util::ConvertBSTRToString(b);六、VARIANT 、_variant_t 与 COleVariantVARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:VARIANT va;int a=2001;va.vt=VT_I4; //指明整型数据va.lVal=a; //赋值对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:unsigned char bVal; VT_UI1short iVal; VT_I2long lVal; VT_I4float fltVal; VT_R4double dblVal; VT_R8VARIANT_BOOL boolVal; VT_BOOLSCODE scode; VT_ERRORCY cyVal; VT_CYDATE date; VT_DATEBSTR bstrVal; VT_BSTRIUnknown FAR* punkVal; VT_UNKNOWNIDispatch FAR* pdispVal; VT_DISPATCHSAFEARRAY FAR* parray; VT_ARRAY|*unsigned char FAR* pbVal; VT_BYREF|VT_UI1short FAR* piVal; VT_BYREF|VT_I2long FAR* plVal; VT_BYREF|VT_I4float FAR* pfltVal; VT_BYREF|VT_R4double FAR* pdblVal; VT_BYREF|VT_R8VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOLSCODE FAR* pscode; VT_BYREF|VT_ERRORCY FAR* pcyVal; VT_BYREF|VT_CYDATE FAR* pdate; VT_BYREF|VT_DATEBSTR FAR* pbstrVal; VT_BYREF|VT_BSTRIUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANTvoid FAR* byref; VT_BYREF_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:long l=222;ing i=100;_variant_t lVal(l);lVal = (long)i;COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:COleVariant v3 = "字符串", v4 = (long)1999;CString str =(BSTR)v3.pbstrVal;long i = v4.lVal;七、其它对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:LPARAM lParam;WORD loValue = LOWORD(lParam); //取低16位WORD hiValue = HIWORD(lParam); //取高16位对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: WORD wValue;BYTE loValue = LOBYTE(wValue); //取低8位BYTE hiValue = HIBYTE(wValue); //取高8位如何将CString类型的变量赋给char*类型的变量1、GetBuffer函数:使用CString::GetBuffer函数。
char *p;CString str="hello";p=str.GetBuffer(str.GetLength());str.ReleaseBuffer();将CString转换成char * 时CString str("aaaaaaa");strcpy(str.GetBuffer(10),"aa");str.ReleaseBuffer();当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();还有很重要的一点就是,在能使用const char *的地方,就不要使用char *2、memcpy:CString mCS=_T("cxl");char mch[20];memcpy(mch,mCS,20);3、用LPCTSTR强制转换:尽量不使用char *ch;CString str;ch=(LPSTR)(LPCTSTR)str;CString str = "good";char *tmp;sprintf(tmp,"%s",(LPTSTR)(LPCTSTR)str);4、CString Msg;Msg=Msg+"abc";LPTSTR lpsz;lpsz = new TCHAR[Msg.GetLength()+1];_tcscpy(lpsz, Msg);char * psz;strcpy(psz,lpsz);CString类向const char *转换char a[100];CString str("aaaaaa");strncpy(a,(LPCTSTR)str,sizeof(a));或者如下:strncpy(a,str,sizeof(a));以上两种用法都是正确地. 因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *.CString转LPCTSTR (const char *)CString cStr;const char *lpctStr=(LPCTSTR)cStr;LPCTSTR转CStringLPCTSTR lpctStr;CString cStr=lpctStr;将char*类型的变量赋给CString型的变量可以直接赋值,如:CString myString = "This is a test";也可以利用构造函数,如:CString s1("Tom");将CString类型的变量赋给char []类型(字符串)的变量1、sprintf()函数CString str = "good";char tmp[200] ;sprintf(tmp, "%s",(LPCSTR)str);(LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)strCString类的变量需要转换为(char*)的时,使用(LPTSTR)(LPCTSTR)str然而,LPCTSTR是const char *,也就是说,得到的字符串是不可写的!将其强制转换成LPTSTR 去掉const,是极为危险的!一不留神就会完蛋!要得到char *,应该用GetBuffer()或GetBufferSetLength(),用完后再调用ReleaseBuffer()。