在C中移位和屏蔽

时间:2013-03-08 14:33:24

标签: c bit-shift bitmask variable-length

我有这个问题。我有一个有效载荷,可以改变它的长度。如果我不削减这个有效载荷,我也会收到垃圾信息。所以我想在有效载荷长度的基础上削减有效载荷。

我有这部分代码:

uint64_t data_tmp = HTONLL((uint64_t) zp->data);
uint8_t len = zp->length;
uint64_t mask = 0xFFFF >> (64 - len);
data_tmp = data_tmp & mask;
printf("DATA_TMP = %llu\n", data_tmp);

zp->数据在写入t->有效载荷字段之后。所以这是我的有效载荷。这是一个64位字段。

我想暂时接受这个有效载荷。 计算我的有效负载长度,即uint8类型的zp->长度字段。 之后,我将创建一个64字节移位的掩码 - payload_length,然后将其应用于临时有效负载,并获得仅包含我想要的数据和全零的字段。

我该怎么做?

例如。如果payload_length为01且有效负载为00 + ..............(垃圾) 我想在64字节上获得像00000000这样的有效载荷。

如果我的payload_length是13并且有效载荷1284732089322309 .... 我想只获得三十个字节。

很抱歉,如果很难说......

2 个答案:

答案 0 :(得分:1)

不确定我是否正确理解了您的问题,但您使用的是逻辑AND而不是二进制AND。

表达式“variable&& variable”的计算结果为1或0

表达式“变量和变量”评估为二进制AND,使用适当的掩码,将按照您的预期裁剪数据

答案 1 :(得分:0)

你需要这个:

uint64_t mask = (1uLL << (len * 4)) - 1;
data_tmp = data_tmp & mask;

这将为您提供最低 len的4位数字。如果您需要最高,则可以在应用蒙版前旋转data_tmp

data_tmp >>= (64 - len * 4)