【发布时间】:2013-03-08 14:33:23
【问题描述】:
我有这个问题。我有一个可以动态改变其长度的有效载荷。如果我不削减这个有效载荷,我也会得到对我来说是垃圾的信息。所以我想根据我的有效载荷长度来削减有效载荷。
我有这部分代码:
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->data 写入 t->payload 字段后。所以这是我的有效载荷。这是一个 64 位字段。
我想暂时拿走这个有效载荷。 计算我的有效载荷长度,即 uint8 类型的 zp->length 字段。 在我创建一个 64 字节移位的掩码之后 - payload_length 以我可以将其应用于临时有效负载并获得一个仅包含我想要的数据和全零的字段的方式。
我该怎么做?
例如。如果 payload_length 为 01 且有效载荷 00+.......(垃圾) 我想在 64 字节上获得像 00000000 这样的有效负载。
如果我的payload_length是13,payload是1284732089322309.... 我只想获取十三个字节。
如果很难说,请见谅……
【问题讨论】:
-
我认为您需要二进制与,而不是逻辑与。试试
data_tmp=data_tmp&mask -
zp->data是如何声明的? -
您的有效载荷是 64 位宽还是 64 字节?
-
另一个问题。为什么需要
htonl?您的数据是否按网络字节顺序排列?问题是,htonl与 uint32_t 一起使用。 -
@sharkbait,对不起,不。如果
len为3,0xFFFF >> (64 - len)将0xFFFF向右旋转61 次,这意味着您将得到0。如果len为60(例如),则掩码将为0xFFF(旋转4位正确)。
标签: c bit-shift bitmask variable-length