c - C 中的移位和掩码

标签 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->data 写入 t->payload 字段后。这就是我的有效负载。这是一个 64 位字段。

我想临时获取此有效负载。 计算我的有效负载长度,即 uint8 类型的 zp->length 字段。 在创建一个掩码后,该掩码会移动 64 字节 - Payload_length,然后我可以将其应用于临时有效负载并获得一个仅包含我想要的数据且全为零的字段。

我该怎么做?

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

如果我的payload_length是13,payload 1284732089322309.... 我只想获取十三个字节。

抱歉,如果很难说...

最佳答案

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

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

表达式“变量和变量”的计算结果为二进制 AND,使用正确的掩码,将按照您预期的方式裁剪数据

关于c - C 中的移位和掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15296381/

相关文章:

c++ - 在 C++ 中使用移位器和缓冲区读取二进制文件

php - 改进此 PHP 位域类的设置/权限?

java - 为什么我的 BitSet 大小为 0?

c - 在 Windows 平台上使用 ANSI-C 可以获得精确到毫秒的系统时间吗?

c - 程序的编译在执行前是否会在缓存中存储一​​些数据?? (C, Linux)

具有结构的 C typedef 函数原型(prototype)在定义之前尝试引用。

C 重定向终端描述符

c# - 在一个字节中找到设置位的位置

java - 位移位操作 java - 输出到 8 位而不是 9 位

c# - 如果位掩码包含位,我该如何检查?