假设我有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个字节。
答案 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;
}