如何读取3个字节作为整数?

时间:2015-04-11 12:23:09

标签: c memory-management io byte buffer

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

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

上述代码不起作用。

3 个答案:

答案 0 :(得分:1)

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

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

通过加入联盟,可以满足对齐问题。

答案 1 :(得分:0)

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

由于机器的int大小(字大小,寄存器大小)通常具有偶数个字节,因此硬件架构总是从总线上的内存中取出偶数个字节到其寄存器中,或者可以取一个字节进入(下)寄存器。因此,在您的问题的注释中提供的解决方案加载一个字节,向左移动并加载下一个字节等。或者,您可以获取一个字和AND输出高位字节。您还必须考虑字节序。最后,并非所有机器都可以从奇数内存加法开始读取整数,或者它们要求它们在某些甚至多个时间内进行对齐。

答案 2 :(得分:0)

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

#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;
}

输出:

  <00> 00000000000000000000000001100001
00000000000000000110001000000000   
00000000011000110000000000000000