1. 程式人生 > >Char, String 和 Byte 等型別間的轉換和編碼

Char, String 和 Byte 等型別間的轉換和編碼

這篇文章的標題看似簡單,那就先從簡單的說起。眾所周知:

1、char 是字元型別;

2、string 是字串型別;

兩者都是及其常用資料型別。雖然一字之差,但是有本質區別:

1、char 在C++中是基礎型別,在C#中是值型別(Value Type)。因此,一個 char 型別的物件所佔用的控制元件總是確定的(不要認為是1個位元組!Byte才是)。在 C++中,一個char變數可能會是1個位元組,也可能是2個位元組,這取決於它是否是Unicode Char(也就是所謂的wchar_t)。然而在C#中,它永遠是2個位元組(沒錯,是永遠,因為其定義就是16位Unicode字元,詳見

MSDN)。

2、string 是一個模板類(C++),也就是一個class了。在C#中,string是引用型別(Reference Type,即使在某些方面有一定值型別的特點)。因此,string物件佔用的空間是可變的,理論上只受記憶體限制,也無法通過 sizeof 來取得的(sizeof 是C++和C#中中的作用一樣)。

其用法當然也是眾所周知的:

1、char 型別用單引號和一個字元來表示,例如: 'A' ,或者 '謝' 。那麼要表示多個字元怎麼辦,就用字元陣列 char [] 就可以了。

這裡還需要注意一個問題,就是C++裡面將一個漢字賦值給一個char型別變數會丟失資訊(因為其只佔用1個位元組),而應該用wchar_t型別。

2、string 型別用雙引號表示,例如:"你好再見。"

下面要開始探討轉換了。

1、char 型別雖然說是字元型別,但是可以隱式或者顯式地轉換為short, int, long 等整數型別(為什麼需要顯示轉換呢?在下面會詳細討論)。例如:

1 2 3 4 char c1 = 'A'; Console.WriteLine((short) c1);  //輸出為 65 char c2 = (char) 97; Console.WriteLine(c2);    //c2值為 'a'

這兩個值相信很多人都能背下來:大寫A的ASCII編碼值為65,小寫a為97。注意一個問題,在C#中,Char的編碼是Unicode,根本不是什麼ASCII,因為定長16位的原因,甚至也不能說“相容ASCII”,但好在這些ASCII字元的數值起碼還是一樣的。

想到點別的順便廢話一下,想說在Excel中的兩個函式Char()和Code():

=CHAR(97) 會返回“a"

=CHAR(98) 會返回“b"

=Code(“a") 會返回“97"

=Code(“b") 會返回“98"

以此類推……

2、char 型別既然可以用來儲存數值,就必然有 signed 和 unsigned 之分。在C++中,

  • signed char 是8位有符號數,取值範圍 -128 到 +127;
  • unsigned char 是8位無符號數,取值範圍從 0 到 255 。

但是在C#中,Char 被規定為無符號的,Byte 型別也是無符號的:

a)Byte 變數以無符號的 8 位(1 個位元組)數字的形式儲存,取值範圍為 0 到 255,因此Byte 資料型別可以隱式轉換為 short、int、long、Single、Double 或 Decimal 資料型別(好像是廢話)。

b)Char 變數以無符號的 16 位(2 個位元組)數字的形式儲存,取值範圍為 0 到 65535(因為其用於表示本來是用來代表 Unicode 字元,Unicode 哪來的負數)。所以重新考慮上面的幾種 Byte 可以隱式轉換成的資料型別,由於short是16位有符號數,不能完全覆蓋 Char 所標示的數值範圍,因此 Char 是不能夠隱式地轉換為 short 型別的。強制轉換當然是可以的,但是要自己承擔System.OverflowException的風險。這是很顯然的,考慮下其佔用的儲存空間就能夠明白,所以建議用Int16,Int32,Int64代替short,int和long的寫法。

那麼至於string型別,它需要佔多少空間呢?

前面已經說了,string的大小是不可以通過sizeof來獲得的。如果嘗試通過sizeof取得string的大小,會遇到編譯錯誤。理論上字串中每個字元都和Char一樣,應該佔2個位元組,而且需要考慮string的最後還有一個特殊的字元,是不可見的'\0',也佔2個位元組。(其實由於string是引用型別,考察其本身在堆上所佔空間其實意義不大)

下面說說字串和字元陣列之間的轉換,也就是 string 和 char []。

1、string 轉換成 Char[] 需要用到 String 的 ToCharArray()方法,例如

1 2 3 string ss="abcdefg"; char[] cc=ss.ToCharArray(); //實際上多數情況下不需要這麼做,因為使用ss[N]可以訪問指定下標的字元物件。

2、Char[] 轉換成string,就更簡單了,可以直接用string的建構函式

1 2 //char [] cc 定義同前段程式碼 string s=new string(cc);

前面說的是字串和字元陣列之間的轉換,下面說說字串和位元組陣列間怎麼轉換。

雖然只差一個字,但區別可就大了,因為這涉及編碼……

請先看下面的程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

相關推薦

Char, String Byte 型別轉換編碼

這篇文章的標題看似簡單,那就先從簡單的說起。眾所周知: 1、char 是字元型別; 2、string 是字串型別; 兩者都是及其常用資料型別。雖然一字之差,但是有本質區別: 1、char 在C++中是基礎型別,在C#中是值型別(Value Ty

CString與LPCWSTR、LPSTR、char*、LPWSTR型別轉換以及CStringLPCTSTR的關係

Cstring建構函式可以傳入 LPCSTR(ANSI字符集時,等價於LPCTSTR), LPCWSTR(UNICODE字符集時,等價於LPCTSTR), Char*(ANSI字符集時,等價於LPSTR,LPTSTR), Wchar_t*(UNICODE字符集時,等價於L

CString與LPCWSTR、LPSTR、char*、LPWSTR型別轉換

CString與LPCWSTR、LPSTR、char*、LPWSTR等型別的轉換 VC++ 2010-09-25 21:23:12 閱讀457 評論3   字號:大中小 訂閱 一.CString與LPCW

CString與LPCWSTR、LPSTR、char*、LPWSTR型別轉換【轉】

一.CString與LPCWSTR      兩者的不同:LPCWSTR 是Unicode字串指標,初始化時串有多大,申請空間就有多大,以後存貯若超過則出現無法預料的結果,這是它與CString的不同之處。而CString是一個串類,記憶體空間類會自動管理。     CString轉換成LPCWSTR    

圖片base64編碼字符串 互相轉換,圖片byte數組互相轉換

16進制 cnblogs exc 十六進制 tostring ati color int inpu 圖片和base64編碼字符串 互相轉換 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; imp

java FileByte[]數組 相互轉換

rac ring eno print [] director mkdir int num public class Test { public static void main(String[] args){ String filePath

C# StringByte數組的轉換

pan style clas -h 數組 ets div system logs string轉byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes(str); byte[] byteArray

檔案的基本操作各種基礎型別轉換

s2_day2 一、檔案操作 r 讀 w 寫 a 追加​​​ 函式: f =open('字串',mode = '對檔案的操作模式',encoding = '編碼方式')​​       #f就是檔案控制代碼 with open

python的資料型別型別轉換、bool

資料型別的出現是為了把資料分成所需記憶體大小不同的資料,程式設計的時候需要用大資料的時候才需要申請大記憶體,就可以充分利用記憶體。 python中的資料型別包括:整型、浮點型和字串型別。 整型 浮點型 字串型別:字串型別的輸入必須加引號(‘‘)

Mysql中char,varchar與text型別的區別選用

關於char,varchar與text平時沒有太在意,一般來說,可能現在大家都是用varchar。但是當要儲存的內容比較大時,究竟是選擇varchar還是text呢?不知道。。。。。。 於是去查閱了一些資料,順便將這三種類型做個比較: (1)char:  char不用多說

java整數byte陣列之間的轉換

做的程式有時候會需要用到, 記錄下 public class NumberUtil { /** * int整數轉換為4位元組的byte陣列 * * @param i * 整數 * @return byte陣列 */ pub

Java中不同數值型別轉換與計算精度丟失問題

在Java程式設計過程中,經常會涉及到不同數值型別之間的計算問題,例如: int m=6; float n=3.5f; double p=2.75d; System.out.println(m + n); System.out.println(n

資料型別型別轉換

  JAVA相關的資料型別      Java中的簡單型別從概念上分為四種:實數、整數、字元、布林值。但是有一點需要說明的是,Java裡面只有八種原始型別,其列表如下:           實數:do

MacWindows遠端伺服器連線檔案互傳(親測可用)

1.工具:Parallels Client,請自行安裝 2.安裝完成介面如下: 2.右鍵點選,新建連線,輸入伺服器IP,點選高階設定按鈕 3.在彈出介面,選在左上角的連線選項,出現如下介面,輸入伺服器使用者名稱密碼,此時可以完成連線,但是無法檔案互傳。  

人工智慧是一門基於電腦科學,生物學,心理學,神經科學,數學哲學學科的科學技術。

計算機出現之前人們就幻想著一種機器可以實現人類的思維,可以幫助人們解決問題,甚至比人類有更高的智力。隨著上世紀40年代計算機的發明,這幾十年來計算速度飛速提高,從最初的科學數學計算演變到了現代的各種計算機應用領域,諸如多媒體應用,計算機輔助設計,資料庫,資料通訊,自動控制等等,人工智慧是電腦科學的一個研究

裝箱拆箱 VS 顯示轉換隱式轉換

8:對裝箱/拆箱更進一步的瞭解 裝箱/拆箱並不如上面所講那麼簡單明瞭,比如:裝箱時,變為引用物件,會多出一個方法表指標,這會有何用處呢? 我們可以通過示例來進一步探討。 舉個例子。 Struct A : ICloneable { public Int32 x; public override St

可以載入Gif動畫png圖片的方法控制元件

final Guide_Result result = new Gson().fromJson(str, Guide_Result.class); // result.setMessage("http://img4.duitang.com/uploads/blog/201405

SAP修改訊息內容報錯型別(SE91OBA5)

SAP訊息也是這樣,你可將所有能忽略的訊息ignore讓它鞠躬盡瘁死而後已為你工作. 從是否允許你configure層次分兩種: configurable和non-configurable.

使用keychain儲存使用者名稱密碼敏感資訊 KeychainItemWrapperSFHFKeychainUtils。

iOS的keychain服務提供了一種安全的儲存私密資訊(密碼,序列號,證書等)的方式,每個ios程式都有一個獨立的keychain儲存。相對於NSUserDefaults、檔案儲存等一般方式,keychain儲存更為安全,而且keychain裡儲存的資訊不會因App被刪

jsjava中日期日期字串的相互轉換使用

摘要:在工作中只要牽扯到日期,很大可能都會牽扯到日期的計算格式的轉換等用法,這篇文章就是要探討一下平常在 js和java中對於日期的使用。 js中日期的使用 js中日期的計算 和 比較 js中兩個日期字串的計算 ###########