C语言 什么是“位填充”或“填充位”到底是什么?

mcvgt66p  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(140)

我只是在互联网上找不到一个很好的解释“位填充”到底是什么,以及没有在任何答案位填充相关的线程在这里堆栈溢出。
我还搜索了ISO 9899-1990,其中提到了“位填充”,但没有解释,因为我需要它。
我在网上找到的关于这一点的唯一内容是here,其中只有一个可笑的简短解释,说:

位填充:

位填充是在传输或存储单元中添加一个或多个额外位,以使其符合标准大小。
一些来源将位填充标识为bit stuffing类型。
这至少是某种信息,但对我来说还不够解释。我不太明白那到底是什么意思。它也指术语"bit stuffing"
当我在Stack Overflow上查看“padding“的相对标记时,padding被描述为:
在内存结构中插入额外的空间以实现地址对齐-或者-在HTML元素的框架和内容之间插入额外的空间-或者-在使用格式化打印命令(如C中的printf* 函数家族)打印值时插入额外的空格或零。

背景:

我经常发现术语“位填充”与数据类型有关,但不明白它是什么,也不知道它到底对那些数据类型做了什么。

bwleehnv

bwleehnv1#

我经常发现术语“位填充”与数据类型有关,但不明白它是什么,也不知道它到底对这些类型有什么作用。
它的要点是它们是“浪费”的空间。我说“浪费”是因为虽然填充位使对象更大,但它可以使处理对象更容易(这意味着更快),并且小的空间浪费可以产生巨大的性能收益。在某些情况下,它是必不可少的,因为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位桶。

o7jaxewo

o7jaxewo2#

假设你有一个8位的数字,它是一个uint8_t,它的值被设置为4。这可能会被存储为a = 0000 0100。现在,假设您希望将其转换为16位数。会发生什么?你必须给这个数字中的“新”位分配一些值。你会如何分配它们?你不能随机分配0或1,原始变量的值会改变。取决于建筑等。你必须用额外的比特来填充**值。在我的例子中,这意味着在原始MSB(最高有效位)之前添加额外的八个零,使我们的数字a = 0000 0000 0000 0100
值仍然是4,但现在您可以分配[0,2^16)范围内的任何内容,而不是[0,2^8)范围。

ztmd8pv5

ztmd8pv53#

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

由于你发布的定义已经是正确的,我将尝试用一个例子来解释:
假设您必须存储占用不到32位的数据,但您有4个字节插槽。通过访问每个插槽更容易访问该数据,因此您只需完成所有32位。完成“给定空间”所需的但不是数据的一部分的附加位符合位填充。
我敢肯定,在多种情况下,可能会有更好的例子。任何人,随时编辑和/或完成新的改进或例子的答案。
希望这对你有帮助!

7fyelxc5

7fyelxc54#

位填充可用于多个上下文中。两个常见的例子是网络和加密。我认为加密上下文更相关。
加密中使用填充是为了使具有公共部分的消息更难破译。如果已知多个消息具有相同的前缀(例如,“hello”),则可以更容易地破解密钥。通过用可变长度的位字段“填充”消息,这使得破解密钥变得更加困难。
据说英国情报部门能够加快对恩尼格玛密码的分析,因为德国人以相同的标题开始他们的信息。
更多技术性的、准确的描述:https://en.wikipedia.org/wiki/Padding_(cryptography)查找有关块密码和位填充的部分

相关问题