0

我在用于向 LCD 显示位图 (.bmp) 的库中阅读了此代码。
我真的很难理解以下几行发生了什么,以及它是如何发生的。

也许有人可以向我解释这一点。

uint16_t s, w, h;
uint8_t* buffer;   // does get malloc'd

s = *((uint16_t*)&buffer[0]);
w = *((uint16_t*)&buffer[18]);
h = *((uint16_t*)&buffer[22]);

我想这对于一个真正的 C 程序员来说并不难,但我还在学习,所以我想我只是问一下 :)
据我所知,它以某种方式将两个uint8_t变量结合到一个uint16_t.

在此先感谢您的帮助!

4

3 回答 3

2

在您提供的代码中,buffer读取(这是一个字节数组),并将值提取到s,wh.

(uint16_t*)&buffer[n]语法意味着您要提取 的第 n 个字节的地址,并将buffer转换为uint16_t*. 转换告诉编译器查看这个地址,就好像指向 a uint16_t一对uint8_ts。
代码中的附加*项取消引用指针,从该地址中提取值。由于地址现在指向 a uint16_tuint16_t因此提取了一个值。

因此:

  1. s获取 first 的值uint16_t字节 0 和 1。
  2. w获取第十个的值uint16_t字节 18 和 19。
  3. h获取第十二个的值uint16_t字节 22 和 23。
于 2012-06-16T12:08:40.250 回答
1
uint8_t* buffer; // pointer to 8 bit or simply one byte

缓冲区指向字节的内存地址 -> |byte0|byte1|byte2|....

(uint16_t*)&buffer[0] // &buffer[0] is actually the same as buffer

(uint16_t*)&buffer[0]等于(uint16_t*)buffer; 它指向 16 位或半字

(uint16_t*)buffer指向内存:|byte0byte1 = halfword0|byte2byte3 = halfword1|....

w = *((uint16_t*)&buffer[18]); 

将内存地址获取到缓冲区中的第 18 个字节,然后将此地址重新解释为半字地址,然后在此地址上获取半字;它只是w = byte18 和 byte19 粘在一起形成一个半字

h = *((uint16_t*)&buffer[22]); 

h = byte22 和 byte 23 粘在一起

UPD更详细的解释:

h = *((uint16_t*)&buffer[22])=>

1) buffer[22]===缓冲区的第22个uint8_t(又名字节);我们称它为 byte22

2) &buffer[22]=== &byte === byte22在内存中的地址;它是 uint8_t* 类型,与缓冲区相同;我们称之为 byte22_address;

3) (uint16_t*)&buffer[22]= (uint16_t*)byte22_address; 将字节的地址转换为(两个字节粘在一起的地址;同一地址的半字地址;我们称之为 halfword11_address;

4) h = *((uint16_t*)&buffer[22])=== *halfword11_address; * 运算符在地址处取值,即第 11 个半字或字节 22 和 23 粘在一起;

于 2012-06-16T11:56:32.843 回答
1

编码:

  • 在缓冲区中的位置 0 和 1 处获取两个字节,将它们粘在一起形成一个无符号的 16 位值,并将结果存储在s;
  • 它对字节 18/19 执行相同的操作,将结果存储在w;
  • 字节 22/23 和h.

值得注意的是,代码使用目标平台的原生字节顺序来决定两个字节中的哪一个代表结果的前 8 位,哪些代表后 8 位。

于 2012-06-16T11:57:05.817 回答