是可以用比特而不是字节来做memcpy吗?

arr*_*arr 5 c ethernet memcpy

我想知道是否可以按位而不是字节进行memcpy

我正在为带有VLAN标记的以太网帧编写C代码,其中我需要填写VLAN标头属性(PCP-3bits,DEI-1bit,VID-12bits)的不同值.

如何对这些位执行memcpy,或者以位为单位向这些属性填充值的任何其他可能性.

提前致谢 !

Pas*_*uoq 6

不可以.比特不可寻址(意味着不能直接从内存中读取它们.它们没有地址.只有字节有地址).

您需要读取包含您感兴趣的位的字节或单词,并自己进行屏蔽.


Ste*_*ppo 0

如果需要填充字段,可以将 C位字段与 a 一起使用struct,如下所示:

struct box_props {
    unsigned first  : 1;
    unsigned second : 3;
    unsigned : 4;
};
Run Code Online (Sandbox Code Playgroud)

例如,其中1表示该字段的长度为 1 位。最后一个(未命名)字段表示:4 位填充。

对其进行定义struct并读取字段,就好像它们在哪里一样。写作也一样。memcpyunsigned

注意:始终填充到整数字节,否则memcpy可能会产生不良影响。