0

ビットマップ (.bmp) を LCD に表示するために使用されるライブラリでこのコードを読みました。次の行で何が起こっているのか、そしてそれがどのよう
に起こるのか を理解するのに非常に苦労しています.

誰かが私にこれを説明できるかもしれません。

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 プログラマーにとってはそれほど難しいことではないと思いますが、私はまだ学んでいるので、質問するだけだと思いました :)
これを理解する限り、2 つのuint8_t変数をuint16_t.

ここであなたの助けを前もってありがとう!

4

3 に答える 3

2

あなたが提供したコードbufferでは、(バイトの配列です)が読み取られ、値が 、および に抽出さswますh

この(uint16_t*)&buffer[n]構文は、 の n番目のバイトのアドレスを抽出しbuffer、それを にキャストすることを意味しますuint16_t*。キャストは、このアドレスを a uint16_tつまりのペアを指しているかのように見るようにコンパイラに指示しますuint8_t
コード内の追加*は、ポインタを逆参照します。つまり、このアドレスから値を抽出します。アドレスが を指しているuint16_tため、uint16_t値が抽出されます。

結果として:

  1. suint16_t最初の値、つまりバイト 0 と 1を取得します。
  2. wuint16_t10 番目の値、つまりバイト 18 と 19を取得します。
  3. h12番目の値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 = バイト 22 とバイト 23 を結合

UPDより詳細な説明:

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

1) buffer[22]=== バッファの 22 番目の uint8_t (別名バイト)。それをbyte22と呼びましょう

2) &buffer[22]=== &byte === メモリ内の byte22 のアドレス。これは uint8_t* 型で、buffer と同じです。byte22_address と呼びましょう。

3) (uint16_t*)&buffer[22]= (uint16_t*)byte22_address; byte のアドレスを (2 バイトをくっつけたもの。同じアドレスのハーフワードのアドレス。halfword11_address と呼びましょう。) のアドレスにキャストします。

4) h = *((uint16_t*)&buffer[22])=== *halfword11_address; * 演算子は、11 番目のハーフワードまたはバイト 22 と 23 をくっつけたアドレスで値を取ります。

于 2012-06-16T11:56:32.843 に答える
1

コード:

  • バッファ内の位置 0 と 1 にある 2 バイトを取得し、それらを結合して符号なし 16 ビット値にし、結果を に格納しsます。
  • バイト 18/19 で同じことを行い、結果を に格納しwます。
  • バイト 22/23 およびh.

このコードでは、ターゲット プラットフォームのネイティブエンディアンを使用して、2 つのバイトのどちらが結果の上位 8 ビットを表し、どちらが下位 8 ビットを表すかを決定することに注意してください。

于 2012-06-16T11:57:05.817 に答える