C#預(yù)定義的基礎(chǔ)類型轉(zhuǎn)換
一、BitConverter 將預(yù)定義的基礎(chǔ)類型與字節(jié)數(shù)據(jù)進(jìn)行互轉(zhuǎn)(Unicode)
1、將值類型轉(zhuǎn)成字節(jié)數(shù)組(Unicode):BitConverter.GetBytes()
byte[] data = BitConverter.GetBytes('哈'); Console.Write(data);//200,84 (兩個(gè)字節(jié)) Console.Write(BitConverter.GetBytes('1'));//49,0 (兩個(gè)字節(jié)) Console.Write(BitConverter.GetBytes(258));//2,1,0,0 (整數(shù),32位,四個(gè)字節(jié)) Console.Write(BitConverter.GetBytes(1.2));//8個(gè)元素 (八個(gè)字節(jié)) Console.Write(BitConverter.GetBytes(true));//1 (一個(gè)字節(jié))
2、將字節(jié)數(shù)組轉(zhuǎn)成值類型:BitConverter.ToXXX()
char str = BitConverter.ToChar(new byte[] { 200, 84 }, 0); Console.Write(str);//哈 short sho = BitConverter.ToInt16(new byte[] { 69, 0 }, 0); Console.Write(sho.ToString());//69
3、將字節(jié)數(shù)組中每個(gè)元素值轉(zhuǎn)成十六進(jìn)制表示:BitConverter.ToString(byte[])
string strHex = BitConverter.ToString(new byte[] { 09, 45, 65, 0, 0 }); Console.Write(strHex);//09-2D-41-00-00 string strHex = BitConverter.ToString(new byte[] { 69, 0, 0, 0, 0 }); Console.Write(strHex);//45-00-00-00-00
注意:跟BitConverter.IsLittleEndian屬性有關(guān),true表示最大的有效字節(jié)位于單詞的右端。
4、舉例說明:
整數(shù) | 對應(yīng)的十六進(jìn)制數(shù) | 轉(zhuǎn)成字節(jié)數(shù)組byte[] BitConverter.GetBytes(**) | 字節(jié)數(shù)據(jù)每個(gè)字節(jié)對應(yīng)的十六進(jìn)制表示 |
1 | 1:0x01 (兩位兩位地對齊) | [1,0,0,0] | 01- 00- 00 -00 |
65540 | 10004:0x1 00 04 (兩位兩位地對齊) | [4,0,1,0] | 04- 00- 01 -00 |
999999999 | 3B9AC9FF:0x3B9AC9FF (兩位兩位地對齊) | [255,201,154,59] | FF -C9- 9A -3B |
二、字符與ASCII碼轉(zhuǎn)化:
一個(gè)ASCII碼占一個(gè)字節(jié),其中一個(gè)為檢驗(yàn)位。共27=128個(gè)字符,只適合所有的拉丁字母。
1、字符轉(zhuǎn)成ASCII碼:
Console.Write(Convert.ToByte('a'));//97 Console.Write((int)'a');//97,強(qiáng)制轉(zhuǎn)換 Console.Write(Convert.ToByte('1'));//49 Console.Write((int)'1');//49
2、ASCII碼轉(zhuǎn)成字符:
Convert.ToChar(97)=>'d'; (char)97='a' --強(qiáng)制轉(zhuǎn)換:
注意:C#中的Char字符類型為Unicode類型,每個(gè)字符占2個(gè)字節(jié)。
三、字符串與十六進(jìn)制表示的字節(jié)數(shù)組之間的轉(zhuǎn)換
void Main() { Console.WriteLine(StrToHex("哈啊a的1我z!")); Console.WriteLine(HexToStr("B9 FE B0 A1 61 B5 C4 31 CE D2 7A 21")); } //字符串轉(zhuǎn)換成十六進(jìn)制字符串 public string StrToHex(string mStr) { return BitConverter.ToString(ASCIIEncoding.Default.GetBytes(mStr)).Replace("-", " "); } // 十六進(jìn)制字符串轉(zhuǎn)換成字符串 public string HexToStr(string mHex) { mHex = mHex.Replace(" ", ""); if (mHex.Length <= 0) return ""; byte[] vBytes = new byte[mHex.Length / 2]; for (int i = 0; i < mHex.Length; i += 2) if (!byte.TryParse(mHex.Substring(i, 2), NumberStyles.HexNumber, null, out vBytes[i / 2])) vBytes[i / 2] = 0; return ASCIIEncoding.Default.GetString(vBytes); }
四、BitArray類
BitArray類用來處理位集合。位集合是可以用來有效表示Boolean值的集合。注意:表示True/False的集合,不是0、1集合。
如:對常規(guī)數(shù)的二進(jìn)制的顯示或存儲(chǔ):
0 0 0 0 0 0 0 1
而對于在BitArray里的存儲(chǔ),它是如下格式:
True False False False False False False False
它的順序是相反的,而且用布爾值很難便捷讀懂,但實(shí)際上,我們應(yīng)當(dāng)把數(shù)值當(dāng)作1和0這樣直觀的顯示出來,并且順序也要進(jìn)行處理!
解決方法:BitArray里顯示的格式是逆序的,并且每一位都用布爾值顯示,我們無法改變BitArray類所用的內(nèi)部代碼,但我們可以編寫外部代碼,使它能夠更加友好的便于理解的常規(guī)的方式顯示出來。
屬性
- Count 獲取 BitArray 中包含的元素個(gè)數(shù)。
- IsReadOnly 獲取一個(gè)值,表示 BitArray 是否只讀。
- Item 獲取或設(shè)置 BitArray 中指定位置的位的值。
- Length 獲取或設(shè)置 BitArray 中的元素個(gè)數(shù)。
方法
- BitArray And( BitArray value ); 對當(dāng)前的 BitArray 中的元素和指定的 BitArray 中的相對應(yīng)的元素執(zhí)行按位與操作。
- bool Get( int index ); 獲取 BitArray 中指定位置的位的值。
- BitArray Not();把當(dāng)前的 BitArray 中的位值反轉(zhuǎn),以便設(shè)置為 true 的元素變?yōu)?false,設(shè)置為 false 的元素變?yōu)?true。
- BitArray Or( BitArray value ); 對當(dāng)前的 BitArray 中的元素和指定的 BitArray 中的相對應(yīng)的元素執(zhí)行按位或操作。
- void Set( int index, bool value ); 把 BitArray 中指定位置的位設(shè)置為指定的值。
- void SetAll( bool value ); 把 BitArray 中的所有位設(shè)置為指定的值。
- BitArray Xor( BitArray value ); 對當(dāng)前的 BitArray 中的元素和指定的 BitArray 中的相對應(yīng)的元素執(zhí)行按位異或操作。
- CopyTo(Array, Int32) 從目標(biāo)數(shù)組的指定索引處開始將整個(gè) BitArray 復(fù)制到兼容的一維 Array。
舉例:
下面創(chuàng)建一個(gè)字節(jié)數(shù)組,里面包含5個(gè)byte。
int bits; string[] binNumber = new string[8];// int binary; byte[] ByteSet = new byte[] { 1, 2, 3, 4, 5 };//定義一個(gè)字節(jié)型數(shù)組,存5個(gè)字節(jié)型數(shù)值:1,2,3,4,5,6 BitArray BitSet = new BitArray(ByteSet);//這里一定要注意,這里的每一個(gè)字節(jié)型數(shù)值是以位的形式、每一位用Boolean值、逆序存儲(chǔ)在BitArray(1字節(jié)對應(yīng)8位) bits = 0;//bits是計(jì)數(shù)器,到8了就又歸為初始值0;為的是方便知道操作完了一個(gè)字節(jié)型數(shù)值(1字節(jié)正好占8位) binary = 7;//binary是二進(jìn)制數(shù)組下標(biāo)索引;初始值為7,這是因?yàn)锽itArray里存儲(chǔ)的數(shù)據(jù)和常規(guī)二進(jìn)制數(shù)據(jù)的順序是相反的 Console.WriteLine("BitSet里包含的元素?cái)?shù)" + BitSet.Count);//40,因?yàn)閿?shù)據(jù)在BitArray里是以位的形式存儲(chǔ)的,5個(gè)字節(jié)型數(shù)值,一個(gè)字節(jié)占8位,所以共占40位?。?!不是5?。?! for (int i = 0; i <= BitSet.Count - 1; i++)//遍歷40個(gè)位,每個(gè)位存boolean值True/False { Console.WriteLine("BitSet.Get(" + i + ")" + BitSet.Get(i)); if (BitSet.Get(i) == true) binNumber[binary] = "1";//如果該位存儲(chǔ)的true值,則轉(zhuǎn)成1; else binNumber[binary] = "0";//如果該位存儲(chǔ)的false值,則轉(zhuǎn)成0; bits++; //計(jì)數(shù)+1 binary--; //eg.第8位(下標(biāo)7)存好,則將下標(biāo)向左移1位存下一輪將位布爾值轉(zhuǎn)成的二進(jìn)制0/1 if ((bits % 8) == 0)//當(dāng)計(jì)數(shù)器為8時(shí),表示一個(gè)字節(jié)型的數(shù)值已經(jīng)表示完全了 { binary = 7;//將存儲(chǔ)字節(jié)型數(shù)值的二進(jìn)制形式的String型數(shù)組的下標(biāo)歸初始 bits = 0; for (int j = 0; j <= 7; j++) Console.Write(binNumber[j]); Console.WriteLine(); } }
結(jié)果:
取整型數(shù)組來試一試,整型數(shù)組是4字節(jié),32位
int bits = 0; int index = 31; string[] s = new string[32]; int[] a = new int[] { 2, 3, 2, 7, 2147483647 }; BitArray BA = new BitArray(a); Console.WriteLine("BA的大小:" + BA.Count); //5*4*8=160 for (int i = 0; i < BA.Count; i++) { Boolean b = BA.Get(i); if (b == true) s[index] = "1"; else s[index] = "0"; bits++; index--; if (bits % 32 == 0) //每隔一個(gè)數(shù)字(4*8)換行 { bits = 0; index = 31; for (int j = 0; j <= 31; j++) Console.Write(s[j]); Console.WriteLine(); } }
結(jié)果:
到此這篇關(guān)于C#基礎(chǔ)類型轉(zhuǎn)換的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#中的自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換
- 詳解c# 強(qiáng)制轉(zhuǎn)換和類型轉(zhuǎn)換
- C# 數(shù)據(jù)類型轉(zhuǎn)換
- C#數(shù)據(jù)類型轉(zhuǎn)換(顯式轉(zhuǎn)型、隱式轉(zhuǎn)型、強(qiáng)制轉(zhuǎn)型)
- C#類型轉(zhuǎn)換之自定義隱式轉(zhuǎn)換和顯式轉(zhuǎn)換
- C#實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型轉(zhuǎn)換方法詳解
- 詳解C#如何實(shí)現(xiàn)隱式類型轉(zhuǎn)換
- C#避免類型轉(zhuǎn)換異常的三種方法
- C# 類型轉(zhuǎn)換(隱式類型,顯式類型,自定義類型)
相關(guān)文章
C#面向?qū)ο筇卣鞯木唧w實(shí)現(xiàn)及作用詳解
所有的面相對象思想,歸根結(jié)底是為了簡化代碼,減少代碼量,構(gòu)建更符合現(xiàn)實(shí)生活邏輯的程序代碼,從而減輕程序員的負(fù)擔(dān)。不能一味地或者說刻意地去使用面相對象的思想而忽略了程序所實(shí)現(xiàn)的功能或者框架,要根據(jù)實(shí)際情況2013-10-10winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法
這篇文章主要介紹了winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法,以實(shí)例分析了C#中WinForm操作窗體及文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09