繁体   English   中英

如何清除C中无符号char数组的位?

[英]How to clear bits of unsigned char array in C?

假设我有一个称为backup的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;

我想将无符号char数组转换为int,然后清除它。

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

您收到的错误消息是因为您试图向数组分配值。 即使您尝试强制转换数组,也无法将其分配为一个整体。

您需要分别对每个字节执行位清除,然后使用移位将各个位放入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中的字节是最高有效字节在先,最高有效位在前。

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

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

根据下面的评论,我要添加此注释:备份的大小必须为[4](或更大),才能在大多数系统上正常工作而不会违反别名规则。

char backup[4];
or 
char *backup = malloc(4);

memcpy仍然可以工作,就像以前使用n = 3一样。'&'操作将照顾到高字节中可能出现的垃圾。

我不明白你到底想做什么,unsigned char是1字节,所以如果要提取前2位,应该使用AND 1100 0000进行逻辑与并向右移6位。

(backup[0] &= C0)>>6

数组中所有元素的处理方式相同。

如果要使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM