C#中的位元組流處理

歡迎您成為我的讀者,希望這篇文章能給你一些幫助。

0x00 前言

在我們日常的編碼工作中,如果你的工作是和下位機硬體有互動的話,想必對於位元組流的處理碰到的機率是很頻繁的,那麼今天咱們就簡單回顧下對於位元組流的資料上位機層面該如何去處理它。

位元組流是一種資料傳輸形式,比如我們的藍芽傳輸、網路傳輸、無線傳輸等到最後都會變成資料的位元組流式傳輸。

對於我們程式設計人員來說,最根本的是掌握位元組流的傳輸規則,其實就是協議。比如我和下位機有資料互動傳輸協議,那麼在傳輸過程中,資料就必須按照雙方規定的協議來傳輸,否則就會出現解析錯誤的情況。

對於協議,它可能包括幀頭,資料報告幀,校驗位,幀尾等。資料的傳輸就是按照這樣的規則進行傳輸的。我們的傳送方和接收方也必須按照協議來發送和解析,否則就會出現錯誤。

對於將資料以資料流的形式利用網路進行傳輸,那麼勢必就需要按照商定的協議來組裝和拆解對應的位元組。

我們可以看看下圖,它是在C#中關於各個資料型別所佔的位元組數。

C#中的位元組流處理

在C#中處理位元組相關的資料流時,主要用到BitConverter 類。

具體可以看MSDN的介紹:

https://docs。microsoft。com/zh-cn/dotnet/api/system。bitconverter?view=netframework-4。5

遇到這樣需要處理位元組流的資料時,我們將其快取中的資料儲存在新開闢的記憶體空間中(此空間需要實時替換儲存資料),透過BitConverter類中的下列方法,就可以取其空間中的資料(根據協議來取)。

C#中的位元組流處理

對於位元組流,在業務需求比較頻繁的時候可能需要使用到狀態機來保證儲存資料的準確性,狀態機之前檔案中有介紹到,有需要了解的朋友可以翻過去看看。

具體可以看看下面的小例子。簡單介紹其BitConverter類中方法的應用。

在進行對位元組陣列的處理過程中,需要特別注意大小端的問題。對於某些資料而言,在不同的計算機系統中,其顯示的數值是不同的。

由於某些方法的返回值取決於系統體系結構,因此在將位元組資料傳輸到計算機邊界之外時請小心:(下面是微軟官方的案例介紹)

如果保證傳送和接收資料的所有系統具有相同的尾系,則不對資料執行任何操作。

如果傳送和接收資料的系統可以具有不同的端序,則始終按特定順序傳輸資料。這意味著,在傳送或接收位元組之前,可能需要反轉陣列中的位元組順序。

如果傳送和接收資料的系統可以具有不同的位元組序,並且要傳輸的資料由帶符號整陣列成,請呼叫方法將資料轉換為網路位元組順序,並呼叫方法將其轉換位接收方所需的順序。

0x01 寄語

人生短暫,我不想去追求自己看不見的,我只想抓住我能看得見的。

原創不易,給個關注。

技術群:新增小編微信並備註進群

頂部