解讀C#中ReadString的一些小疑惑
ReadString的一些小疑惑
BinaryReader . ReadString 方法 ()
從當(dāng)前流中讀取一個(gè)字符串。 字符串有長(zhǎng)度前綴,一次 7 位地被編碼為整數(shù)。
初學(xué)文件操作, 當(dāng)我看見(jiàn)ReadString這個(gè)方法時(shí), 很疑惑,字符串有長(zhǎng)度前綴, 前綴在哪,誰(shuí)定義的?
最后在無(wú)數(shù)次驗(yàn)證和冥想后,在百度中找到了答案。。。
其實(shí)這個(gè)長(zhǎng)度前綴是由BinaryWriter, Write(string)這個(gè)方法寫(xiě)進(jìn)去的,這個(gè)長(zhǎng)度前綴一次7位被編碼為整數(shù), 也就是說(shuō),一般一個(gè)字節(jié)是8位, 但是他七位就編程一個(gè)字節(jié), 所以這個(gè)字節(jié)最大的長(zhǎng)度為128,所以當(dāng)一個(gè)字節(jié)為128時(shí),用于長(zhǎng)度的每個(gè)字節(jié)只用7個(gè)比特,最高位用來(lái)表示是否有后續(xù)長(zhǎng)度字節(jié),
0 0000101, 最高位零,因此長(zhǎng)度為5。
1 0000011,最高位為 1 ,表示還有后續(xù)字節(jié),用兩個(gè)字節(jié) 來(lái)表示長(zhǎng)度為 1 * 128 + 3 = 131。
下面給出我驗(yàn)證的結(jié)果:
這里都是用16進(jìn)制來(lái)展示的 轉(zhuǎn)化為二進(jìn)制:
80 為1 0000000,因?yàn)樽罡呶粸? 表示進(jìn)了一位 所以再用一個(gè)字節(jié)表示進(jìn)位0 0000001
也就是 1 * 128 = 128 ;
80 02 也就是 2 * 128 = 256 ;
D8 23 也就是 23轉(zhuǎn)化為十進(jìn)制 35 * 128 = 4480 ;
D8 二進(jìn)制位:11011000; 要減一個(gè) 最高位 也就是
11011000 - 10000000 = 10 11000 = 88(十進(jìn)制);
7E 二進(jìn)制:0 1111110; 最高位為0; 所以不需要進(jìn)位 為126;


總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#控制臺(tái)程序如何發(fā)布到服務(wù)器Linux上運(yùn)行
這篇文章主要給大家介紹了關(guān)于C#控制臺(tái)程序如何發(fā)布到服務(wù)器Linux上運(yùn)行的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11
asp.net(c#)編程實(shí)現(xiàn)將彩色圖片變灰階圖片的方法示例
這篇文章主要介紹了asp.net(c#)編程實(shí)現(xiàn)將彩色圖片變灰階圖片的方法,結(jié)合實(shí)例形式分析了C#圖片讀取及屬性操作相關(guān)技巧,需要的朋友可以參考下2017-07-07
C# Partial:分部方法和分部類(lèi)代碼實(shí)例
這篇文章主要介紹了C# Partial:分部方法和分部類(lèi)代碼實(shí)例,本文直接給出代碼實(shí)現(xiàn),需要的朋友可以參考下2015-03-03
詳解C#如何在不同工作簿之間復(fù)制選定單元格區(qū)域
處理Excel文檔時(shí),我們經(jīng)常需要將數(shù)據(jù)整合到一個(gè)工作表以便于我們進(jìn)行管理或數(shù)據(jù)對(duì)比。本文將演示如何通過(guò)編程方式將選定的單元格區(qū)域從一個(gè)工作簿復(fù)制到另一個(gè)工作簿2023-02-02
C#調(diào)用FFmpeg操作音視頻的實(shí)現(xiàn)示例
本文主要介紹了C#調(diào)用FFmpeg操作音視頻的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C# 調(diào)用C++寫(xiě)的dll的實(shí)現(xiàn)方法
C#調(diào)用C++的非托管類(lèi)的dll其實(shí)很簡(jiǎn)單基本就是固定的調(diào)用格式,有需要的朋友可以參考一下2013-10-10
c#使用filesystemwatcher監(jiān)視文件系統(tǒng)的變化
對(duì)于一個(gè)文件夾的改變,C#這邊有自己的類(lèi)來(lái)實(shí)現(xiàn),我們不需要關(guān)心它的內(nèi)部實(shí)現(xiàn)機(jī)制,不需要關(guān)心它底層調(diào)用哪些API,我們只需要關(guān)心如何去調(diào)用它,如何讓它幫助我們記錄文件夾的修改情況即可,下面我們就實(shí)現(xiàn)它2014-01-01
C#實(shí)現(xiàn)多種圖片格式轉(zhuǎn)換的示例詳解
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)多種圖片格式轉(zhuǎn)換,例如轉(zhuǎn)換成圖標(biāo)圖像ICO,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
C#實(shí)現(xiàn)創(chuàng)建桌面快捷方式與添加網(wǎng)頁(yè)到收藏夾的示例
本文是介紹了c#通過(guò)純代碼創(chuàng)建快捷方式與添加網(wǎng)頁(yè)到收藏夾,非常具有實(shí)用價(jià)值,有需要的朋友可以來(lái)了解一下。2016-10-10

