如何读取3个字节的整数?

How to read 3 bytes as a whole number?

如何一次从 unsigned char 缓冲区中读取 3 个字节(作为整数)?

uint_24 p = *(unsigned char[3])buffer;

以上代码无效。

简短的回答是:你不能(除非机器 int 大小是 3 个字节)。

由于机器通常有偶数个字节作为其 int 大小(字大小、寄存器大小),硬件体系结构将始终通过总线从内存中获取偶数个字节到其寄存器中,或者可以获取一个单字节到一个(低)寄存器。因此,在对您的问题的评论中提供的解决方案加载一个字节,将其左移并加载下一个字节等。或者,您可以获取一个单词并将高位字节与输出。您还必须考虑字节顺序。最后,并非所有机器都可以读取从奇数内存地址开始的整数,或者它们要求它们以某个偶数倍对齐。

您可以复制任意数量的字节,如下所示:

#include <stdio.h>
void showbits(int n)
{
    int i,k,andmask;

    for(i=31;i>=0;i--)
    {
        andmask = 1 << i;
        k = n & andmask;

        k == 0 ? printf("0") : printf("1");
    }
    printf("\n");

}

int main()
{
    unsigned char buff[] = {'a',0,0,
                            0,'b',0,
                            0,0,'c'};
    //'a'=97=01100001
    //'b'=98=01100010
    //'c'=99=01100011
    void * src_ptr= (void *) buff;
    int i;
    for(i = 0 ; i < sizeof(buff) ; i += 3)
    {
        int num = 0 ;
        void * num_ptr = &num;
        memcpy(num_ptr , src_ptr , 3);
        showbits(num);
        src_ptr += 3;

    }

    return 0;
}

输出:

00000000000000000000000001100001
00000000000000000110001000000000
00000000011000110000000000000000

如果可以将缓冲区重新定义为联合的一部分并且整数字节序符合预期:

union {
  unsigned char buffer[3];
  uint_24 p;
} x;

foo(x.buffer);              // somehow data is loaded into x.buffer
uint_24 destination = x.p;  // read: let compiler do the work

通过合并,对齐问题得到解决。