簡體   English   中英

位排序和結束

[英]bit ordering and endianess

我正在逐字節地讀取文件。

比如說我有這個字節:0x41(0100 0001)用十六進制表示。

現在,我想要這個字節的前三位,即(010)。

我可以使用按位邏輯來提取前三位,但我的問題是前三位是否與機器的endianess無關(即它們不能是001)?

謝謝,

字節順序僅適用於字節順序,而不適用於位順序。 位的順序在相應的字節內是相同的。

想到這一點的另一種方法是只有在你可以單獨讀取項目的組件時才會應用字節順序 - 因為你通常可以獨立地從內存中讀取32位int的各個字節,如果你想將這些字節解釋為32 -bit int您需要確保考慮架構的endianess。

通常你不能從內存中讀取一個字節的各個位,所以就存儲器架構而言,確實沒有“位字節式”的概念(我確信存在硬件級別,但不是你能做到的事情)看看軟件層面)。 您可能需要處理(或至少知道)位字節序的一些區域:

  1. 編譯器存儲位字段位的順序取決於編譯器(並且不一定與硬件平台的字節順序相關 - 不同的編譯器可能會為同一平台不同地排序位字段 - 編譯器可能是單向配置的或者另一個使用命令行選項,類似於char可以設置為有符號或無符號的方式)。 但是,C位字段實際上與硬件尋址無關。

  2. 某些硬件架構允許您處理單個位(例如ARM Cortex M3),因此在這種情況下,您需要知道如果要使用該功能,架構如何安排用於尋址的位。

  3. 如果您通過串行鏈路發送位 - 硬件接口通常會指定最高有效位或最低有效位是否先在線路上“移位”。

是的,他們會是一樣的。

在讀取通過串行線發送的數據流時,例如當您進行逐位I / O時,字節內的位排序通常只是一個問題。 那些確實一次發送一個比特,所以發送者和接收者需要同意每個字節是從左到右還是從右到左發送比特。

對於文件和內存中訪問,字節內的位排序不會改變。

當字段使用字節的一部分時,或者跨越字節開始或結束(或兩者)的字節順序時,位順序很重要。

示例:2字節數據先235(十進制)秒173(十進制),又名十六進制EB和AD。

我希望從第4位開始到第12位的位域。 因此,跳過3位,從接下來的9位產生9位無符號整數。

我聲稱有4種可能的結果:

byteOrder,    bitOrder

* bigEndian,    bigEndian    results in hex 0BA or decimal 186
* littleEndian, littleEndian results in hex 1BD or decimal 445
* littleEndian, bigEndian    results in hex 05D or decimal 93
* bigEndian,    littleEndian results in hex 1DE or decimal 478

我已經在數據中看到了這4個中的前3個。 大,小,小,很容易鍛煉。

提示處理這個問題。

如果字節順序是大端,則從左向右寫入字節。 如果字節順序是小端,則從右向左寫入字節。

有點混亂:-)。 除串行通信外,術語“第一位”沒有意義,只有最左側(最高位)和最右側(最低位)位。 如果有人告訴你要提取“前三位”然后給他們一個耳光並問他們的意思。 即使術語“位0”是模糊的,它通常意味着最低有效位,最右位(2 ** 0位),但幾乎常用於表示某些位域中最重要的最左位。 哪個位是字節中的“第一”位完全取決於您對這些位的處理。

C中的按位運算符被定義為處理 表達式0x41U >> 5將始終給出值2(二進制,010)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM