?
Byte和byte[]數組,“表示一個 8 位無符號整數, 一般為8位二進制數”。
Byte是計算機最基礎的存儲單位和最基礎的通訊單位。
而所有的類型都是支持由byte[]類型轉換而來。
?
為什么說Byte是最基礎類型那,
其實這里的關鍵所在是,計算機最基礎的算法是編碼,包括媒體文件、圖片、各種文檔以致計算機算有數據的文件展現都是字符串,而這些字符串都是由編碼得來。
?
不管你是各種千奇百怪的字符串組成的格式,最終都要根據編碼表,字符轉換成相對應的十進制數字,而這相應的十進制數字那,就會存儲在byte[]數組中(這里的十進制數是用來計算的,存儲時會自動轉換為二進制數字存儲,程序計算時會按十進制計算)。
?
媒體文件、圖片、各種文檔等等—》源文件由字符串組成,多個字符—》單個字符—》十進制數字(根據相應編碼)—》byte[]數組(單個字符) —》byte[]數組(多個字符) —》媒體文件、圖片、各種文檔等等存儲單位或通訊單位。
?
此時這個“單個字符”二進制的長度就是根據相應編碼得來的,由多個字符組成的byte[]就組成了媒體文件、圖片、各種文檔等等的源文件。
?
具體如下:
UTF-8編碼:一個英文字符等于一個字節,一個中文(含繁體)等于三個字節。
Unicode編碼:一個英文等于兩個字節,一個中文(含繁體)等于兩個字節。
?
下面可以看到UTF-8編碼的byte[]數組(C# byte[]默認存儲計算為十進制),所以說最終計算機數據是由byte類型組成數據為基礎的。
? ? ? ? ? ? ? ? ? ? ? ?
?
?
?
?
?
網絡傳輸:
?
如果是自己程序間的對接,byte[]類型理論上就夠了(實際上也不夠,哈哈),在傳輸段傳輸byte[]類型,收取端收取byte[]類型,然后轉化為原格式就可以了。
?
“a張”編碼—>byte[0]=97、byte[1]=229、byte[2]=188、byte[3]=160(byte[0]=01100001、byte[1]=11100101、byte[2]=10111100、byte[3]=10100000)—>傳輸—>收取為byte[]—> 解碼“a張”。
?
?????? 但是如果傳輸的數據是開放式的,或者生成可讀的文件,比如文件格式的,url,xml、json的話,是不能存儲byte[]型的,看不懂也沒法解析,這就要求再吧byte[]再編碼為字符串類型。
?
到了網絡傳輸過程了,前文我們已經得到了文件最基礎的存儲格式,byte[]數組,但作為程序傳輸他面臨個問題,因為程序傳輸一般可見的是以字符形式傳輸的(中間過程是網絡層自動轉換的),那么就需要把byte[]類型轉換為字符串傳輸,很多人是感覺怎么有轉換為字符串了,這不是和原來一樣了嗎,其實不是,現在編碼的就不是任意字符串了,是基礎的二進制數字10做成的字符串,相當于把byte[]類型每個byte轉換為字符串傳送,而在接收端在轉換為byte[]數組,這相當于無編碼過程。
?
byte[]是數據類型的,長度是有限制的,也不靈活。所以說基礎傳輸其實是1和0組成的長字符串。
簡單的說就是數據編碼成byte[],byte[]再二次編碼成為易于傳送的字符串。
如下
“a張”編碼—>byte[0]=97、byte[1]=229、byte[2]=188、byte[3]=160(byte[0]=01100001、byte[1]=11100101、byte[2]=10111100、byte[3]=10100000)—>不編碼“01100001111001011011110010100000” —>傳輸—>解析成為byte[]—>解碼“a張”
?
“a張”編碼—>byte[0]=97、byte[1]=229、byte[2]=188、byte[3]=160(byte[0]=01100001、byte[1]=11100101、byte[2]=10111100、byte[3]=10100000)—> ?base64 編碼串—>傳輸—>解析成為byte[]—>解碼“a張”
?
?????? 更多的是,在轉換字符串傳輸的過程,還要對這個byte[]進行編碼。
注1:在傳輸過程中,基礎的byte[]類型還可以做各種編碼傳輸,如base64字符串、16進制編碼、xml、json、html等等,不過萬變不離其中的是編碼和解碼。
?
注2:“傳輸”時,還是以基礎二進制數據傳輸,不過這和應用層無關,是傳輸層自動完成了,應用層的數據只需要處理自己的傳輸格式就可以了。