[英]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.