簡體   English   中英

究竟什么是“位填充”或“填充位”?

[英]What is “bit padding” or “padding bits” exactly?

我不想用這個來騷擾你,但我在互聯網上的任何地方都找不到對“位填充”真正含義的詳細解釋,也沒有在 StackOverflow 上找到與位填充相關的線程的任何答案.

我還搜索了 ISO 9899-1990,其中提到了“位填充”,但由於我需要它而沒有解釋。

我在 web 中發現的關於此的唯一內容是在這里,其中只給出了一個句子的荒謬簡短解釋,說:

位填充:

位填充是向傳輸或存儲單元添加一個或多個額外位以使其符合標准大小。

一些資料來源將位填充識別為一種位填充

這至少是某種信息,但對我來說還不夠解釋。 我不太明白這到底是什么意思。 它也指術語“位填充”


當我在 StockOverflow 上查看“填充”的相對標簽時,填充被描述為:

Extra space inserted into memory structures to achieve address alignment -or- extra space between the frame and the content of an HTML element -or- extra spaces or zeros when printing out values using formatting print commands like, in C, the printf*-family的功能。

背景:

我經常發現與數據類型相關的術語“位填充”,但不明白它是什么,也不明白它對這些數據的作用。

非常感謝您提供任何基於主題的答案。

我經常發現與數據類型有關的術語“位填充”,但不明白它是什么,也不明白它對這些數據的作用。

它的要點是它們是“浪費”的空間。 我說“浪費”是因為雖然有填充位會使 object 更大,但它可以使 object 的工作更容易(這意味着更快),並且小的空間浪費可以產生巨大的性能提升。 在某些情況下,這是必不可少的,因為 CPU 無法處理這種大小的對象。

假設你有一個類似的結構(所有數字只是一個例子,不同的平台可以有不同的值):

struct foo
{
    short a; // 16 bits
    char  b; // 8 bits 
};

並且您正在使用的機器在一次讀取操作中讀取 32 位數據。 讀取單個 foo 不是問題,因為整個 object 適合該 32 位塊。 真正成為問題的是當你有一個數組時。 關於 arrays 要記住的重要一點是它們是連續的,元素之間沒有空格。 它只是一個 object 緊接着另一個。 所以,如果你有一個像

foo array[10]{};

有了這個,第一個foo object 位於 32 位存儲桶中。 數組的下一個元素將在第一個 32 位存儲桶和第二個 32 位存儲桶中。 這意味着成員a在兩個單獨的桶中。 一些處理器可以做到這一點(需要付出代價),如果你嘗試這樣做,其他處理器就會崩潰。 為了解決這兩個問題,編譯器將在foo的末尾添加填充位以填充其大小。 這意味着 foo 實際上變成了

struct foo
{
    short a; // 16 bits
    char  b; // 8 bits 
    char  _; // 8 bits of padding
};

現在處理器很容易自己或在數組中處理foo對象。 它不需要做任何額外的工作,您只需為每個 object 添加 8 位。 您需要很多對象才能開始在現代機器上發揮作用。

由於未對齊的訪問,有時您需要在類型成員之間進行填充。 假設你有

struct bar
{
    char c; // 8 bits
    int  d; // 32 bits
};

現在bar是 40 位寬,並且d更頻繁,然后 not 將再次存儲在兩個不同的桶中。 為了解決這個問題,編譯器在cd之間添加了填充位

struct bar
{
    char    c; // 8 bits
    char _[3]; // 24 bits
    int     d; // 32 bits
};

現在d保證將 go 放入單個 32 位存儲桶中。

位填充:
位填充是向傳輸或存儲單元添加一個或多個額外位以使其符合標准大小。

由於您發布的定義已經正確,我將嘗試舉例說明:

假設您必須存儲占用少於 32 位但您有 4 字節插槽的數據。 通過訪問每個插槽更容易訪問該數據,因此您只需完成所有 32 位。 完成“給定空間”所需但不屬於數據一部分的附加位符合位填充。

我敢肯定,在多種情況下可能會有更好的例子。 任何人,都可以隨意編輯和/或通過新的改進或示例完成答案。

希望這可以幫助!

所以假設你有一個 8 位數字,它是一個uint8_t ,它的值設置為4 這可能會存儲為a = 0000 0100 現在,假設您希望將其轉換為 16 位數字。 會發生什么? 您必須為此數字中的“新”位分配一些值。 你會如何分配它們? 您不能隨機分配零或一,原始變量的值會發生變化。 根據架構等,您必須用額外的位填充值。 就我而言,這意味着在原始 MSB(最高有效位)之前添加了額外的八個額外零,使我們的數字a = 0000 0000 0000 0100

值仍然是 4,但現在您可以分配 [0, 2^16) 范圍內的任何內容,而不是 [0, 2^8) 范圍。

位填充可以在多個上下文中使用。 兩個常見的例子是網絡和加密。 我相信加密上下文更相關。

填充用於加密,以使解密具有共同部分的消息變得更加困難。 如果已知多條消息具有相同的前綴(例如,“hello”),則更容易破解密鑰。 通過使用可變長度位字段“填充”消息,它使破解密鑰變得更加困難。

據說英國情報部門能夠加快對 Enigma 信息的分析,因為德國人以相同的標題開始他們的信息。

如需更多技術性、准確的描述: https://en.wikipedia.org/wiki/Padding_(cryptography)查找有關分組密碼和位填充的部分

暫無
暫無

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

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