如何一次从unsigned char
缓冲区读取3个字节(作为整数)?
uint_24 p = *(unsigned char[3])buffer;
上述代码不起作用。
答案 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 = #
memcpy(num_ptr , src_ptr , 3);
showbits(num);
src_ptr += 3;
}
return 0;
}
输出:
<00> 00000000000000000000000001100001
00000000000000000110001000000000
00000000011000110000000000000000