究竟是“填充位”还是“填充位”?

问题描述 投票:-1回答:4

我不想骚扰您,但我只是无法在互联网上找到关于“位填充”的真正含义的详尽说明,也无法在此处找到与位填充相关的线程的任何答案。在StackOverflow上。

我还搜索了ISO 9899-1990,其中提到了“位填充”,但由于需要而未作详细解释。

[我在网络上发现的唯一与此相关的内容是here,其中只对一个句子给出了一个荒谬的简短解释,说:

位填充:

位填充是向传输或存储单元添加一个或多个额外的位,以使其符合标准大小。

某些来源将位填充标识为bit stuffing的类型。

至少提供了某种信息,但对我来说解释不够。我不太明白那是什么意思。它也指术语"bit stuffing"


[当我在StockOverflow上查看“ padding”的相对标记时,填充描述为:

插入到内存结构中的额外空间以实现地址对齐-或-框架和HTML元素内容之间的额外空间-或者-使用格式打印命令(如C中的printf)打印出值时,额外的空间或零* -功能家族。

背景:

我经常在数据类型的关系中找到术语“位填充”,但不了解它是什么,也不了解这些内容是什么。

c++ c memory memory-management padding
4个回答
1
投票

位填充:位填充是向传输或存储单元添加一个或多个额外的位,以使其符合标准大小。

由于您发布的定义已经正确,所以我将尝试通过一个示例进行解释:

假设您必须存储占用少于32位的数据,但是您有4个字节的插槽。通过访问每个插槽可以更轻松地访问该数据,因此您只需完成所有32位。完成“给定空间”所需的其他位(不是数据的一部分)符合位填充。

我确信在多种情况下可能会有更好的例子。任何人都可以随时使用新的改进或示例来编辑和/或完成答案。

希望这会有所帮助!


1
投票

因此,假设您有8位数字,它是uint8_t,并且其值设置为4。这可能会存储为a = 0000 0100。现在,假设您希望将其转换为16位数字。会发生什么?您必须为该数字中的“新”位分配一些值。您将如何分配它们?您不能随机分配零或一,原始变量的值将更改。根据体系结构等,您必须使用附加位来pad值。在我的情况下,这意味着在原始MSB(最高有效位)之前再添加八个额外的零,使我们的数字为a = 0000 0000 0000 0100

值仍然是4,但是现在您可以在[0,2 ^ 16)范围内分配任何内容,而不是[0,2 ^ 8)范围。


0
投票

位填充可以在多种情况下使用。网络和加密是两个常见的示例。我认为加密上下文更相关。

填充在加密中使用,使解密消息变得更加困难,这是共有的部分。如果已知多个消息具有相同的前缀(例如“ hello”),则使破解密钥变得更加容易。通过使用可变长度的位字段“填充”消息,将使破解密钥变得更加困难。

被告知,英国情报部门能够加快对Enigma消息的分析,因为德国人以相同的标题开始了他们的消息。

有关更多技术,准确的描述:https://en.wikipedia.org/wiki/Padding_(cryptography)查找有关分组密码和位填充的部分


0
投票

我经常在数据类型的关系中找到术语“位填充”,但不了解它是什么,也不了解这些内容是什么。

要点是它们是“浪费”的空间。我之所以说“浪费”是因为具有填充位可以使对象更大,但可以使对象的工作变得更加轻松(这意味着更快),而空间浪费也可以带来巨大的性能提升。在某些情况下,这是必不可少的,因为CPU无法处理该大小的对象。

假设您有一个类似的结构(所有数字仅是示例,不同的平台可以具有不同的值):

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

并且您正在使用的机器通过一次读取操作读取32位数据。读取单个foo并不是问题,因为整个对象都适合该32位块。确实成为问题的是当您拥有数组时。关于数组要记住的重要一点是它们是连续的,元素之间没有空格。它只是一个对象,紧随其后。因此,如果您有一个数组,例如

foo array[10]{};

因此,第一个foo对象位于32位存储桶中。不过,数组的下一个元素将位于第一个32位存储桶和第二个32位存储桶中。这意味着成员a位于两个单独的存储桶中。如果您尝试执行此操作,则某些处理器可能会这样做(需要付费),而其他处理器则会崩溃。为了解决这两个问题,编译器将在foo的末尾添加填充位以填充其大小。这意味着foo实际上变成

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

现在,处理器可以很容易地自行或以数组形式处理foo对象。它不需要做任何额外的工作,并且每个对象仅添加了8位。您需要很多对象才能在现代机器上开始变得重要。

有时,由于访问权限未对齐,因此需要在类型的成员之间填充。可以说你有

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

现在bar为40位宽,然后d的使用频率将不再以两个不同的方式存储。为了解决这个问题,编译器在cd类似之间添加了填充位>

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

现在d保证可以放入一个32位存储桶中。

© www.soinside.com 2019 - 2024. All rights reserved.