【问题标题】:Shift and masking in CC中的移位和屏蔽
【发布时间】: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


【解决方案1】:

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

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

表达式 "variable & variable" 计算为二进制 AND,使用适当的掩码,将按照您的预期裁剪数据

【讨论】:

    【解决方案2】:

    你需要这个:

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

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

    data_tmp >>= (64 - len * 4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      相关资源
      最近更新 更多