'用於打包和解包數據的C語言聯合'

C語言 Word 程序員 硬件 編譯器 EEtoday 2019-08-31
"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

用於打包和解包數據的C語言聯合


此聯合中有兩個成員:第一個成員“word”是一個雙字節變量。第二個成員是兩個單字節變量的結構。為聯合分配的兩個字節在其兩個成員之間共享。分配的內存空間可以如下面的圖1所示。

"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

用於打包和解包數據的C語言聯合


此聯合中有兩個成員:第一個成員“word”是一個雙字節變量。第二個成員是兩個單字節變量的結構。為聯合分配的兩個字節在其兩個成員之間共享。分配的內存空間可以如下面的圖1所示。

用於打包和解包數據的C語言聯合

圖1


“word”變量指的是整個分配的存儲空間,“byte1”和“byte2”變量指的是構成“word”變量的單字節區域。如何使用此功能?假設有兩個單字節變量“x”和“y”,它們應該組合起來產生一個雙字節變量。在這種情況下,可以使用上面的聯合並按如下方式將“x”和“y”分配給結構成員。

"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

用於打包和解包數據的C語言聯合


此聯合中有兩個成員:第一個成員“word”是一個雙字節變量。第二個成員是兩個單字節變量的結構。為聯合分配的兩個字節在其兩個成員之間共享。分配的內存空間可以如下面的圖1所示。

用於打包和解包數據的C語言聯合

圖1


“word”變量指的是整個分配的存儲空間,“byte1”和“byte2”變量指的是構成“word”變量的單字節區域。如何使用此功能?假設有兩個單字節變量“x”和“y”,它們應該組合起來產生一個雙字節變量。在這種情況下,可以使用上面的聯合並按如下方式將“x”和“y”分配給結構成員。

用於打包和解包數據的C語言聯合


可以讀取聯合“word”成員來獲得由“x”和“y”變量組成的雙字節變量(參見圖2)。

"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

用於打包和解包數據的C語言聯合


此聯合中有兩個成員:第一個成員“word”是一個雙字節變量。第二個成員是兩個單字節變量的結構。為聯合分配的兩個字節在其兩個成員之間共享。分配的內存空間可以如下面的圖1所示。

用於打包和解包數據的C語言聯合

圖1


“word”變量指的是整個分配的存儲空間,“byte1”和“byte2”變量指的是構成“word”變量的單字節區域。如何使用此功能?假設有兩個單字節變量“x”和“y”,它們應該組合起來產生一個雙字節變量。在這種情況下,可以使用上面的聯合並按如下方式將“x”和“y”分配給結構成員。

用於打包和解包數據的C語言聯合


可以讀取聯合“word”成員來獲得由“x”和“y”變量組成的雙字節變量(參見圖2)。

用於打包和解包數據的C語言聯合

圖2


上面的例子顯示了聯合將兩個單字節變量打包成一個雙字節變量的使用。也可以反過來:將一個雙字節值寫入“word”並通過讀取“x”和“y”變量將其解壓縮為兩個單字節變量。將值寫入聯合的一個成員並讀取另一個成員,它有時被稱為“數據壓縮”。

處理器端序

使用聯合打包/解包數據時,需要注意處理器端序。正如Robert Keim關於端序的文章中所討論的,該術語指定了數據對象的字節存儲在內存中的順序。處理器可以是小端或大端。對於大端處理器,數據的存儲方式包含最高有效位的字節具有最低的存儲器地址。在小端系統中,首先存儲包含最低有效位的字節。圖3中描述的示例說明了序列0x01020304的小端和大端存儲。

"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

用於打包和解包數據的C語言聯合


此聯合中有兩個成員:第一個成員“word”是一個雙字節變量。第二個成員是兩個單字節變量的結構。為聯合分配的兩個字節在其兩個成員之間共享。分配的內存空間可以如下面的圖1所示。

用於打包和解包數據的C語言聯合

圖1


“word”變量指的是整個分配的存儲空間,“byte1”和“byte2”變量指的是構成“word”變量的單字節區域。如何使用此功能?假設有兩個單字節變量“x”和“y”,它們應該組合起來產生一個雙字節變量。在這種情況下,可以使用上面的聯合並按如下方式將“x”和“y”分配給結構成員。

用於打包和解包數據的C語言聯合


可以讀取聯合“word”成員來獲得由“x”和“y”變量組成的雙字節變量(參見圖2)。

用於打包和解包數據的C語言聯合

圖2


上面的例子顯示了聯合將兩個單字節變量打包成一個雙字節變量的使用。也可以反過來:將一個雙字節值寫入“word”並通過讀取“x”和“y”變量將其解壓縮為兩個單字節變量。將值寫入聯合的一個成員並讀取另一個成員,它有時被稱為“數據壓縮”。

處理器端序

使用聯合打包/解包數據時,需要注意處理器端序。正如Robert Keim關於端序的文章中所討論的,該術語指定了數據對象的字節存儲在內存中的順序。處理器可以是小端或大端。對於大端處理器,數據的存儲方式包含最高有效位的字節具有最低的存儲器地址。在小端系統中,首先存儲包含最低有效位的字節。圖3中描述的示例說明了序列0x01020304的小端和大端存儲。

用於打包和解包數據的C語言聯合

圖3.圖片由IAR提供。


使用以下代碼來實驗上一節的聯合:

"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

用於打包和解包數據的C語言聯合


此聯合中有兩個成員:第一個成員“word”是一個雙字節變量。第二個成員是兩個單字節變量的結構。為聯合分配的兩個字節在其兩個成員之間共享。分配的內存空間可以如下面的圖1所示。

用於打包和解包數據的C語言聯合

圖1


“word”變量指的是整個分配的存儲空間,“byte1”和“byte2”變量指的是構成“word”變量的單字節區域。如何使用此功能?假設有兩個單字節變量“x”和“y”,它們應該組合起來產生一個雙字節變量。在這種情況下,可以使用上面的聯合並按如下方式將“x”和“y”分配給結構成員。

用於打包和解包數據的C語言聯合


可以讀取聯合“word”成員來獲得由“x”和“y”變量組成的雙字節變量(參見圖2)。

用於打包和解包數據的C語言聯合

圖2


上面的例子顯示了聯合將兩個單字節變量打包成一個雙字節變量的使用。也可以反過來:將一個雙字節值寫入“word”並通過讀取“x”和“y”變量將其解壓縮為兩個單字節變量。將值寫入聯合的一個成員並讀取另一個成員,它有時被稱為“數據壓縮”。

處理器端序

使用聯合打包/解包數據時,需要注意處理器端序。正如Robert Keim關於端序的文章中所討論的,該術語指定了數據對象的字節存儲在內存中的順序。處理器可以是小端或大端。對於大端處理器,數據的存儲方式包含最高有效位的字節具有最低的存儲器地址。在小端系統中,首先存儲包含最低有效位的字節。圖3中描述的示例說明了序列0x01020304的小端和大端存儲。

用於打包和解包數據的C語言聯合

圖3.圖片由IAR提供。


使用以下代碼來實驗上一節的聯合:

用於打包和解包數據的C語言聯合


運行此代碼,得到以下輸出:Word是:0X4321。這表明共享存儲空間的第一個字節(“u1.byte1”)用於存儲“word”變量的最低有效字節(0X21)。換句話說,用來執行代碼的處理器是小端。

如你所見,聯合的特定應用程序可以表現出依賴於實現的行為。但是,這不應該是一個嚴重的問題,因為對於這種低級編碼,通常知道處理器端序。如果不知道這些細節,可以使用上面的代碼來了解數據在內存中的組織方式。

替代方案

可以使用按位運算符來執行數據打包或解包,而不是使用聯合。例如,可使用以下代碼組合兩個單字節變量“byte3”和“byte4”,並生成一個雙字節變量(“word2”):

"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

用於打包和解包數據的C語言聯合


此聯合中有兩個成員:第一個成員“word”是一個雙字節變量。第二個成員是兩個單字節變量的結構。為聯合分配的兩個字節在其兩個成員之間共享。分配的內存空間可以如下面的圖1所示。

用於打包和解包數據的C語言聯合

圖1


“word”變量指的是整個分配的存儲空間,“byte1”和“byte2”變量指的是構成“word”變量的單字節區域。如何使用此功能?假設有兩個單字節變量“x”和“y”,它們應該組合起來產生一個雙字節變量。在這種情況下,可以使用上面的聯合並按如下方式將“x”和“y”分配給結構成員。

用於打包和解包數據的C語言聯合


可以讀取聯合“word”成員來獲得由“x”和“y”變量組成的雙字節變量(參見圖2)。

用於打包和解包數據的C語言聯合

圖2


上面的例子顯示了聯合將兩個單字節變量打包成一個雙字節變量的使用。也可以反過來:將一個雙字節值寫入“word”並通過讀取“x”和“y”變量將其解壓縮為兩個單字節變量。將值寫入聯合的一個成員並讀取另一個成員,它有時被稱為“數據壓縮”。

處理器端序

使用聯合打包/解包數據時,需要注意處理器端序。正如Robert Keim關於端序的文章中所討論的,該術語指定了數據對象的字節存儲在內存中的順序。處理器可以是小端或大端。對於大端處理器,數據的存儲方式包含最高有效位的字節具有最低的存儲器地址。在小端系統中,首先存儲包含最低有效位的字節。圖3中描述的示例說明了序列0x01020304的小端和大端存儲。

用於打包和解包數據的C語言聯合

圖3.圖片由IAR提供。


使用以下代碼來實驗上一節的聯合:

用於打包和解包數據的C語言聯合


運行此代碼,得到以下輸出:Word是:0X4321。這表明共享存儲空間的第一個字節(“u1.byte1”)用於存儲“word”變量的最低有效字節(0X21)。換句話說,用來執行代碼的處理器是小端。

如你所見,聯合的特定應用程序可以表現出依賴於實現的行為。但是,這不應該是一個嚴重的問題,因為對於這種低級編碼,通常知道處理器端序。如果不知道這些細節,可以使用上面的代碼來了解數據在內存中的組織方式。

替代方案

可以使用按位運算符來執行數據打包或解包,而不是使用聯合。例如,可使用以下代碼組合兩個單字節變量“byte3”和“byte4”,並生成一個雙字節變量(“word2”):

用於打包和解包數據的C語言聯合


比較這兩個解決方案在小端和大端情況下的輸出,參考以下代碼:

"

前一篇文章討論了最初的聯合應用程序已經為互斥變量創建了一個共享內存區域。但隨著時間的推移,程序員已廣泛將聯合用於完全不同的應用程序:從較大的數據對象中提取較小的數據部分。在本文中,我們將更詳細地介紹這個聯合的特定應用。

使用聯合打包/解包數據

聯合的成員存儲在共享內存區域中。這是允許我們為聯合找到有趣應用程序的關鍵功能。考慮下面的聯合:

用於打包和解包數據的C語言聯合


此聯合中有兩個成員:第一個成員“word”是一個雙字節變量。第二個成員是兩個單字節變量的結構。為聯合分配的兩個字節在其兩個成員之間共享。分配的內存空間可以如下面的圖1所示。

用於打包和解包數據的C語言聯合

圖1


“word”變量指的是整個分配的存儲空間,“byte1”和“byte2”變量指的是構成“word”變量的單字節區域。如何使用此功能?假設有兩個單字節變量“x”和“y”,它們應該組合起來產生一個雙字節變量。在這種情況下,可以使用上面的聯合並按如下方式將“x”和“y”分配給結構成員。

用於打包和解包數據的C語言聯合


可以讀取聯合“word”成員來獲得由“x”和“y”變量組成的雙字節變量(參見圖2)。

用於打包和解包數據的C語言聯合

圖2


上面的例子顯示了聯合將兩個單字節變量打包成一個雙字節變量的使用。也可以反過來:將一個雙字節值寫入“word”並通過讀取“x”和“y”變量將其解壓縮為兩個單字節變量。將值寫入聯合的一個成員並讀取另一個成員,它有時被稱為“數據壓縮”。

處理器端序

使用聯合打包/解包數據時,需要注意處理器端序。正如Robert Keim關於端序的文章中所討論的,該術語指定了數據對象的字節存儲在內存中的順序。處理器可以是小端或大端。對於大端處理器,數據的存儲方式包含最高有效位的字節具有最低的存儲器地址。在小端系統中,首先存儲包含最低有效位的字節。圖3中描述的示例說明了序列0x01020304的小端和大端存儲。

用於打包和解包數據的C語言聯合

圖3.圖片由IAR提供。


使用以下代碼來實驗上一節的聯合:

用於打包和解包數據的C語言聯合


運行此代碼,得到以下輸出:Word是:0X4321。這表明共享存儲空間的第一個字節(“u1.byte1”)用於存儲“word”變量的最低有效字節(0X21)。換句話說,用來執行代碼的處理器是小端。

如你所見,聯合的特定應用程序可以表現出依賴於實現的行為。但是,這不應該是一個嚴重的問題,因為對於這種低級編碼,通常知道處理器端序。如果不知道這些細節,可以使用上面的代碼來了解數據在內存中的組織方式。

替代方案

可以使用按位運算符來執行數據打包或解包,而不是使用聯合。例如,可使用以下代碼組合兩個單字節變量“byte3”和“byte4”,並生成一個雙字節變量(“word2”):

用於打包和解包數據的C語言聯合


比較這兩個解決方案在小端和大端情況下的輸出,參考以下代碼:

用於打包和解包數據的C語言聯合


如果為大端處理器(如TMS470MF03107)編譯此代碼,則輸出將為:Word1:0X2143;Word2:0X2143。但是,如果為一個小端處理器(如STM32F407IE)編譯它,輸出將是:Word1:0X4321;Word2:0X2143。

基於聯合的方法表現出依賴於硬件的行為,而不管處理器的字節順序如何,基於移位操作的方法導致相同的結果。這是因為採用後一種方法,為變量名稱(“word2”)賦值,編譯器負責設備使用的內存組織。但是,使用基於聯合的方法,正在更改構造“word1”變量的字節值。儘管基於聯合的方法表現出依賴於硬件的行為,但它具有更易讀和可維護的優點。這就是程序員喜歡在這個應用程序中使用聯合的原因。

關於“數據壓縮”的實例 內容的介紹請打開下面鏈接進行查看:https://www.eetoday.com/application/iot/92296.html

"

相關推薦

推薦中...