c#数据类型转换BYTEfloatdoublechar类型间的转换方法Word文档下载推荐.docx
《c#数据类型转换BYTEfloatdoublechar类型间的转换方法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《c#数据类型转换BYTEfloatdoublechar类型间的转换方法Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
System.Int32(整型,占4字节,表示32位整数,范围-2,147,483,648到2,147,483,647)
long->
System.Int64(长整型,占8字节,表示64位整数,范围大约-(10的19)次方到10的19次方)
float->
System.Single(单精度浮点型,占4个字节)
double->
System.Double(双精度浮点型,占8个字节)
我们可以用下列代码做一个实验:
privatevoidTestAlias(){
//this.textBox1是一个文本框,类型为System.Windows.Forms.TextBox//设计中已经将其Multiline属性设置为true
bytea=1;
charb='
a'
;
shortc=1;
intd=2;
longe=3;
uintf=4;
boolg=true;
this.textBox
1.Text="
"
1.AppendText("
byte->
"
+a.GetType().FullName+"
\n"
);
char->
+b.GetType().FullName+"
short->
+c.GetType().FullName+"
+d.GetType().FullName+"
+e.GetType().FullName+"
uint->
+f.GetType().FullName+"
+g.GetType().FullName+"
}
在窗体中新建一个按钮,并在它的单击事件中调用该TestAlias()函数,我们将看到运行结果如下:
System.Byte
System.Char
System.Int16
System.Int32
System.Int64
System.UInt32
System.Boolean
这足以说明各别名对应的类!
2.数值类型之间的相互转换
这里所说的数值类型包括byte,short,int,long,fload,double等,根据这个排列顺序,各种类型的值依次可以向后自动进行转换。
举个例来说,把一个short型的数据赋值给一个int型的变量,short值会自动行转换成int型值,再赋给int型变量。
如下例:
privatevoidTestBasic(){
shortb=a;
intc=b;
longd=c;
floate=d;
doublef=e;
bytea="
+a.ToString()+"
shortb="
+b.ToString()+"
intc="
+c.ToString()+"
longd="
+d.ToString()+"
floate="
+e.ToString()+"
doublef="
+f.ToString()+"
译顺利通过,运行结果是各变量的值均为1;
当然,它们的类型分别还是System.Byte型„„System.Double型。
现在我们来试试,如果把赋值的顺序反过来会怎么样呢?
在TestBasic()函数中追加如下语句:
intg=1;
shorth=g;
h="
+h.ToString()+"
结果编译报错:
G:
\Projects\VisualC#\Convert\Form
1.cs
(118):
无法将类型“int”隐式转换为“short”
其中,Form
1.cs的118行即shorth=g所在行。
这个时候,如果我们坚持要进行转换,就应该使用强制类型转换,这在C语言中常有提及,就是使用“(类型名)变量名”形式的语句来对数据进行强制转换。
如上例修改如下:
shortg=1;
byteh=(byte)g;
//将short型的g的值强制转换成short型后再赋给变量h
编译通过,运行结果输出了h=1,转换成功。
但是,如果我们使用强制转换,就不得不再考虑一个问题:
short型的范围是-32768~23767,而byte型的范围是0~255,那么,如果变量g的大小超过了byte型的范围又会出现什么样的情况呢?
我们不妨再一次改写代码,将值改为265,比255大10
shortg=265;
//265=255+10
编译没有出错,运行结果却不是h=265,而是h=9。
因此,我们在进行转换的时候,应当注意被转换的数据不能超出目标类型的范围。
这不仅体现在多字节数据类型(相对,如上例的short)转换为少字节类型(相对,如上例的byte)时,也体现在字节数相同的有符号类型和无符号类型之间,如将byte的129转换为sbyte就会溢出。
这方面的例子大同小异,就不详细说明了。
3.字符的ASCII码和Unicode码
很多时候我们需要得到一个英文字符的ASCII码,或者一个汉字字符的Unicode码,或者从相关的编码查询它是哪一个字符的编码。
很多人,尤其是从VB程序序转过来学C#的人,会报怨C#里为什么没有提供现成的函数来做这个事情――因为在VB中有Asc()函数和Chr()函数用于这类转换。
但是如果你学过C,你就会清楚,我们只需要将英文字符型数据强制转换成合适的数值型数据,就可以得到相应的ASCII码;
反之,如果将一个合适的数值型数据强制转换成字符型数据,就可以得到相应的字符。
C#中字符的范围扩大了,不仅包含了单字节字符,也可以包含双字节字符,如中文字符等。
而在字符和编码之间的转换,则仍延用了C语言的做法――强制转换。
不妨看看下面的例子
privatevoidTestChar(){
charch='
shortii=65;
TheASCIIcodeof\'
+ch+"
\'
is:
+(short)ch+"
ASCIIis"
+ii.ToString()+"
thecharis:
+(char)ii+"
this.textBox
Unicodeis"
+uc.ToString()+"
+(char)uc+"
}它的运行结果是
TheASCIIcodeof'
97
ASCIIis65,thecharis:
A
TheUnicodeof'
中'
20013
Unicodeis22478,thecharis:
城从这个例子中,我们便能非常清楚的了解――通过强制转换,可以得以字符的编码,或者得到编码表示的字符。
如果你需要的不是short型的编码,请参考第1条进行转换,即可得到int等类型的编码值。
4.数值字符串和数值之间的转换
首先,我们得搞明白,什么是数值字符串。
我们知道,在C#中,字符串是用一对双引号包含的若干字符来表示的,如"
123"
。
而"
又相对特殊,因为组成该字符串的字符都是数字,这样的字符串,就是数值字符串。
在我们的眼中,这即是一串字符,也是一个数,但计算机却只认为它是一个字符串,不是数。
因此,我们在某些时候,比如输入数值的时候,把字符串转换成数值;
而在另一些时候,我们需要相反的转换。
将数值转换成字符串非常简单,因为每一个类都有一个voidToString()方法。
所有数值型的voidToString()方法都能将数据转换为数值字符串。
如
123.ToSting()就将得到字符串"
那么反过来,将数值型字符串转换成数值又该怎么办呢?
我们仔细查找一下,会发现short,int,float等数值类型均有一个staticParse()函数。
这个函数就是用来将字符串转换为相应数值的。
我们以一个float类型的转换为例:
floatf=float.Parse("
543.21"
其结果f的值为
543.21F。
当然,其它的数值类型也可以使用同样的方法进行转换,下面的例子可以更明确的说明转换的方法:
privatevoidTestStringValue(){
floatf=
54.321F;
stringstr="
f="
if(int.Parse(str)==123){
strconverttointsuccessfully."
}else{
strconverttointfailed."
}}运行结果:
f=
54.321
strconverttointsuccessfully.
5.字符串和字符数组之间的转换
字符串类System.String提供了一个voidToCharArray()方法,该方法可以实现字符串到字符数组的转换。
privatevoidTestStringChars(){
mytest"
char[]chars=str.ToCharArray();
Lengthof\"
mytest\"
is"
+str.Length+"
Lengthofcharrayis"
+chars.Length+"
char[2]="
+chars[2]+"
例中以对转换到的字符数组长度和它的一个元素进行了测试,结果如下:
Lengthof"
is6
Lengthofchararrayis6
char[2]=t
可以看出,结果完全正确,这说明转换成功。
那么反过来,要把字符数组转换成字符串又该如何呢?
我们可以使用System.String类的构造函数来解决这个问题。
System.String类有两个构造函数是通过字符数组来构造的,即
String(char[])和String[char[],int,int)。
后者之所以多两个参数,是因为可以指定用字符数组中的哪一部分来构造字符串。
而前者则是用字符数组的全部元素来构造字符串。
我们以前者为例,在TestStringChars()函数中输入如下语句:
char[]tcs={'
t'
'
e'
s'
'
m'
};
stringtstr=newString(tcs);
tstr=\"
+tstr+"
\"
运行结果输入tstr="
testme"
,测试说明转换成功。
实际上,我们在很多时候需要把字符串转换成字符数组只是为了得到该字符串中的某个字符。
如果只是为了这个目的,那大可不必兴师动众的去进行转换,我们只需要使用System.String的[]运算符就可以达到目的。
请看下例,再在TestStringChars()函数中加入如如下语名:
charch=tstr[3];
[3]="
+ch.ToString());
正确的输出是"
[3]=t,经测试,输出正确。
6.字符串和字节数组之间的转换
如果还想从System.String类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了。
为了进行这样的转换,我们不得不借助另一个类:
System.Text.Encoding。
该类提供了bye[]GetBytes(string)方法将字符串转换成字节数组,还提供了stringGetString(byte[])方法将字节数组转换成字符串。
System.Text.Encoding类似乎没有可用的构造函数,但我们可以找到几个默认的Encoding,即Encoding.Default(获取系统的当前ANSI代码页的编码)、Encoding.ASCII(获取7位ASCII字符集的编码)、Encoding.Unicode(获取采用Little-Endian字节顺序的Unicode格式的编码)、Encoding.UTF7(获取UTF-7格式的编码)、Encoding.UTF8(获取UTF-8格式的编码)等。
这里主要说说Encoding.Default和Encoding.Unicode用于转换的区别。
在字符串转换到字节数组的过程中,Encoding.Default会将每个单字节字符,如半角英文,转换成1个字节,而把每个双字节字符,如汉字,转换成2个字节。
而Encoding.Unicode则会将它们都转换成两个字节。
我们可以通过下列简单的了解一下转换的方法,以及使用Encoding.Default和
Encodeing.Unicode的区别:
privatevoidTestStringBytes(){
strings="
C#语言"
byte[]b1=System.Text.Encoding.Default.GetBytes(s);
byte[]b2=System.Text.Encoding.Unicode.GetBytes(s);
stringt1="
t2="
foreach(bytebinb1){
t1+=b.ToString("
)+"
}foreach(bytebinb2){
t2+=b.ToString("
}this.textBox
b
1.Length="
+b
1.Length+"
1.AppendText(t1+"
2.Length="
2.Length+"
1.AppendText(t2+"
}运行结果如下,不说详述,相信大家已经明白了。
b1.Length=6
6735211239209212b2.Length=8
6703502371390138
将字节数组转换成字符串,使用Encoding类的string
GetString(byte[])或stringGetString(byte[],int,int)方法,具体使用何种Encoding还是由编码决定。
在TestStringBytes()函数中添加如下语句作为实例:
byte[]bs={97,98,99,100,101,102};
stringss=System.Text.Encoding.ASCII.GetString(bs);
Thestringis:
+ss+"
运行结果为:
abcdef
7.各种数值类型和字节数组之间的转换
在第1条中我们可以查到各种数值型需要使用多少字节的空间来保存数据。
将某种数值类型的数据转换成字节数组的时候,得到的一定是相应大小的字节数组;
同样,需要把字节数组转换成数值类型,也需要这个字节数组大于相应数值类型的字节数。
现在介绍此类转换的主角:
System.BitConverter。
该类提供了byte[]GetBytes(...)方法将各种数值类型转换成字节数组,也提供了ToInt
32、ToInt
16、ToInt
64、ToUInt
32、ToSignle、ToBoolean等方法将字节数组转换成相应的数值类型。
由于这类转换通常只是在需要进行较细微的编码/解码操作时才会用到,所以这里就不详细叙述了,仅把System.BitConverter类介绍给大家。
8.转换成十六进制
任何数据在计算机内部都是以二进制保存的,所以进制与数据的存储无关,只与输入输出有关。
所以,对于进制转换,我们只关心字符串中的结果。
在上面的第4条中提到了ToString()方法可以将数值转换成字符串,不过在字符串中,结果是以十进制显示的。
现在我们带给它加一些参数,就可以将其转换成十六进制――使用ToString(string)方法。
这里需要一个string类型的参数,这就是格式说明符。
十六进制的格式说明符是"
x"
或者"
X"
,使用这两种格式说明符的区别主要在于A-F六个数字:
代表a-f使用小写字母表示,而"
而表示A-F使用大字字母表示。
privatevoidTestHex(){
inta=188;
a
(10)="
(16)="
+a.ToString("
运行结果如下:
a(10)=188a(16)=bca(16)=BC
这时候,我们可能有另一种需求,即为了显示结果的整齐,我们需要控制十六进制表示的长度,如果长度不够,用前导的0填补。
解决这个问题,我们只需要在格式说明符“x”或者“X”后写上表示长度的数字就行了。
比如,要限制在4个字符的长度,可以写成“X4”。
在上例中追加一句:
X4"
其结果将输出a
(16)=00BC。
现在,我们还要说一说如何将一个表示十六进制数的字符串转换成整型。
这一转换,同样需要借助于Parse()方法。
这里,我需要Parse(string,System.Globalization.NumberStyles)方法。
第一个参数是表示十六进制数的字符串,如“AB”、“20”(表示十进制的32)等。
第二个参数
System.Globalization.NumberStyles是一个枚举类型,用来表示十六进制的枚举值是HexNumber。
因此,如果我们要将“AB”转换成整型,就应该这样写:
intb=int.Parse("
AB"
System.Glo