如何正确地字节移位一大块数据?
How do I properly byte shift a chunk of data?
我有一个mmap
void *mymap;
mymap = mmap(0, attr.st_size, PROT_READ|PROT_WRITE, MAPFILE|MAP_SHARED, fd, 0);
我打开了一个 HEX 内容为 0x25362364 的文件
00100101001101100010001101100100
二进制。现在我想执行位移:
char *str = (char *)mymap;
for(int i=0;i<attr.st_size;i++) {
str[i] = str[i] >> 4;
}
我的新文件包含新的二进制数
00000010000000110000001000000110
但希望的结果是将所有内容向右移动 4 位:
00000010010100110110001000110110
我怎样才能做到这一点?
奖金问题:如果二进制数 MSB 是 1,我如何在向右移动时将左侧填充为 0?
数组中的每个字节应右移 4 位,并与前一个(无符号)字节左移 4 位进行或运算。例如
unsigned char *str = (unsigned char *)mymap;
unsigned char prev = 0, next;
for(int i = 0; i < attr.st_size; i++) {
next = str[i];
str[i] = (str[i] >> 4) | (prev << 4);
prev = next;
}
如果要右移5位,则右移5位,左移3位,sum = 8(假设CHAR_BIT
为8)。
我有一个mmap
void *mymap;
mymap = mmap(0, attr.st_size, PROT_READ|PROT_WRITE, MAPFILE|MAP_SHARED, fd, 0);
我打开了一个 HEX 内容为 0x25362364 的文件
00100101001101100010001101100100
二进制。现在我想执行位移:
char *str = (char *)mymap;
for(int i=0;i<attr.st_size;i++) {
str[i] = str[i] >> 4;
}
我的新文件包含新的二进制数
00000010000000110000001000000110
但希望的结果是将所有内容向右移动 4 位:
00000010010100110110001000110110
我怎样才能做到这一点? 奖金问题:如果二进制数 MSB 是 1,我如何在向右移动时将左侧填充为 0?
数组中的每个字节应右移 4 位,并与前一个(无符号)字节左移 4 位进行或运算。例如
unsigned char *str = (unsigned char *)mymap;
unsigned char prev = 0, next;
for(int i = 0; i < attr.st_size; i++) {
next = str[i];
str[i] = (str[i] >> 4) | (prev << 4);
prev = next;
}
如果要右移5位,则右移5位,左移3位,sum = 8(假设CHAR_BIT
为8)。