如何清除C中的unsigned char数组?

时间:2017-07-31 13:13:01

标签: c bit-manipulation

假设我有unsigned char数组称为备份,我想复制一些字节。但我想要做的是清除大部分位(从右到左为18位)。我需要留下的是左边的两位。这是我的尝试:

memcpy (buf, " AA", 3);
unsigned char backup[3];
memcpy( backup, buf, 3 ); // backup
int two_bits_backup;
two_bits_backup = (int) backup &= ~0b001111111111111111111111;

但它会产生错误: 左值作为赋值的左操作数

如何成功清除这两位?

我想要做的是清除这些位(粗体)

如果two_bits_backup = 0b11 1111111111111111111111 ;

case two_bits_backup ==   0b110000000000000000000000;

我想将unsigned char数组转换为int然后清除它。

我在C和32位平台上使用它,其中int有4个字节。

4 个答案:

答案 0 :(得分:3)

您收到的错误消息是因为您正在尝试为数组分配值。即使您尝试使用数组,也无法将数组作为整体分配。

您需要分别对每个字节执行位清零,然后使用位移将各个位置于two_bits_backup

backup[0] &= ~0x3f;
backup[1] &= ~0xff;
backup[2] &= ~0xff;

two_bits_backup = backup[0] << 16;
two_bits_backup |= backup[1] << 8;
two_bits_backup |= backup[2];

请注意,这假定backup中的字节首先是最高有效字节,最高有效位是第一位。

答案 1 :(得分:1)

另一种方法是使用备份指向int的指针:

two_bits_backup = *(int*)backup &= ~0b001111111111111111111111;

根据以下评论,我添加了这个说明:备份必须大小为[4](或更多)才能在大多数系统上正常运行而不违反别名规则。

char backup[4];
or 
char *backup = malloc(4);
memcpy仍然可以工作,因为n = 3很明显。'&amp;'操作将处理高位字节中可能的垃圾。

答案 2 :(得分:0)

我不明白你想要做什么。未签名的字符是1个字节。所以你应该使用1100 0000进行逻辑AND,如果要提取前2位,则应该向右移6位。

DATABASE1 before the query: **TABLENAME: DomainsActiV7**

 +-------------------------------+--------------+
 |            Domain             |  NumOfClicks |
 +-------------------------------+--------------+
 |        domaindomain.com       |              |
 +-------------------------------+--------------+
 |    stackoverflowislove.com    |              |
 +-------------------------------+--------------+
 |             ...               |              |
 +-------------------------------+--------------+

DATABASE2 before the query: **TABLENAME: ActiV7**

     +-------------------------------+--------------+
     |            Email              |  NumOfClicks |
     +-------------------------------+--------------+
     |     info@domaindomain.com     |     43156    |
     +-------------------------------+--------------+
     | super@stackoverflowislove.com |      561     |
     +-------------------------------+--------------+
     |             ...               |              |
     +-------------------------------+--------------+

对于数组中的所有元素都是一样的。

答案 3 :(得分:0)

如果要使用char数组来管理24位整数,可以这样操作(对于小端机器)。但是,恕我直言,这不是一个干净的方式。

#include <stdio.h>
#include <string.h>

int main(void)
{
    unsigned char buf[3];

    // Backup should be sizeof(unsigned int) bytes because an int of 3 bytes doesn't exist!
    unsigned char backup[sizeof(unsigned int)];
    unsigned int two_bits_backup;

    memcpy (buf, " AA", sizeof(buf));
    // memset (buf, 0xD5, sizeof(buf));

    memset( backup, 0, sizeof(unsigned int));
    memcpy( backup, buf, sizeof(buf) ); // backup

    printf("%08X\n",*(unsigned int *)(backup));

    two_bits_backup = *(unsigned int *)(backup) &= ~0b001111111111111111111111;

    printf("%08X\n",two_bits_backup);

    return 0;
}