如何正确地字节移位一大块数据?

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)。