C语言中的位移操作

3

我最近决定开展一个短信项目,通过手机发送和接收短信。

数据以PDU格式发送 - 我需要将ASCII字符转换为7位GSM字母字符。为此,我找到了几个示例,例如http://www.dreamfabric.com/sms/hello.html

此示例显示第二个七位组的最右位被插入到第一个七位组中,以创建一个八位组。

按位移位不会导致这种情况发生,因为 >> 将向左插入,<< 将向右插入。据我所知,我需要某种按位旋转来创建这个过程 - 有人可以告诉我如何从右侧移动位并将其插入到左侧吗?

谢谢!


啊,这让我想起了往事。 :) 我就是喜欢他们定义服务号码和电话号码应该如何编码... - epatel
如果你在C语言中遇到了旋转n位的问题,你可以使用>>n<<(length-n)|来模拟它。 - Pascal Cuoq
你不需要位移旋转。你需要的是一个相邻字节的低位,而不是从当前字节中移出的位。 - Peter Cordes
2个回答

3
这里有一个快速算法来完成这个任务:
int b1, bnext;
int mod;
int pand;
char *b; // this is your byte buffer, with message content
int blen; // this is your byte buffer length
char sb[160];
int totchars = 0;

b1 = bnext = 0;
for (int i=0; i < blen; i++) {
    mod = i%7;
    pand = 0xff >> (mod + 1);
    b1 = ((b[i] & pand) << mod) | bnext;
    bnext = (0xff & b[i]) >> (7 - mod);
    sb[totchars++] = (char)b1;
    if (mod == 6) {
        sb[totchar++] = (char)bnext;
        bnext = 0;
    }
}
sb[totchar] = 0;

它将会把7位压缩的缓冲区转换成在C语言中的正常ASCII字符数组。


0
有人能告诉我如何将位从右侧移动并插入到左侧吗?
在 C 中有间接的方法,但我会简单地这样做:
void main()
{
    int x = 0xBAADC0DE;
    __asm
    {
        mov eax, x;
        rol eax, 1;
    }
}

这将把位向左旋转(而不是移位!)(一步)。 "ror"将向右旋转。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接