2017-09-19 15 views
2

私は配列一度に2バイトずつ配列から読み込みますか?

uint8_t data_buffer[64]; 

を宣言し、私はそれに書き、その後、私はデータのそれの店舗を見て、それを反復する必要があります。データは2つのグループで記述されます。今、私はこの

for(int i = 1; i < BUFFER_LEN + 1; i += 2) 
{ 
    if(data_buffer[i] == 0xff && data_buffer[i+1] == 0xff) 
    { 
     write_led_states(i/2 + 1, OFF); 
    } 
    else 
    { 
     write_led_states(i/2 + 1, ON); 
    } 
} 

のような厄介な何かをやっているしかし、私は多くはので、私はより多くのこのような何かを行うことができ、バッファから一度に2バイトのデータを読むことができるように好む

for(int i = 1; i < BUFFER_LEN + 1; i++) 
{ 
    if(data_buffer[i] == 0xffff) // where data_buffer is being read two bytes at a time 
    { 
     write_led_states(i, OFF); 
    } 
    else 
    { 
     write_led_states(i, ON); 
    } 
} 

私が何をしたいのかというのがもう一つの方法は、彼らがこのように見てから行くように、インデックスを再マッピングすることです:

[1][2][3][4][5][6][7][8] 

to this like:

[1...][2...][3...][4...] 

これは可能ですか?

+3

あなたの現在のコードは、範囲外の配列にアクセスするように思えます。あなたは配列が0ベースであることを知っていますか? –

+0

バッファの最初のバイトは使用されていませんか? ( 'data_buffer [0]') –

+0

バッファの最初のバイトには、後続のデータ型を示すフラグが含まれています。しかし、私はそう思う、私は最後に外出している。 – Indigo

答えて

2

変更この:

uint16_t data_buffer[32]; 

uint_16_t素子当たり2バイト(16ビット)を使用する(64の半分のサイズを調整する):これ

uint8_t data_buffer[64]; 


PS:あなたのコードはここに、未定義の動作を呼び出す範囲外の配列を、アクセスしているようだ:

for(int i = 1; i < BUFFER_LEN + 1; i += 2) 

配列のインデックスは0から始まるので、これは0から開始しなければなりません条件はi < BUFFER_LENである必要があります。

しかし、私のappraochで、次の2つずつ増加する必要はありませんので、あなたは、単にこのように、ループのためのクリーンを行います

for(int i = 0; i < BUFFER_LEN; ++i) 
+0

ここには大きな/リトルエンディアンの問題があります。それを確認しましたか? –

+1

@PaulOgilvie、なぜですか?彼はlittle/bigエンディアンで同じ表現である '0xffff'をチェックしています。 –

+0

@ LuisColorado、もしそれが '0xffff'だけに関係するのであれば問題はありません。それが1つの使用または例に過ぎない場合、解決策によってカバーされない問題が存在する可能性があり、解決策がこの仮定/制限を示すものではない。 –

1

単に要素あたり2バイトである、代わりにuint16_tを使用し、それが問題になることがあれば、

uint16_t data_buffer[32]; 

はエンディアンに注意してください。

:あなたが配列は0をインデックス化していることを知っていないことが表示されますので、

for (int i = 1; i < BUFFER_LEN + 1; i += 2) 

はおそらく(最も可能性が高い)もshoul、

for (int i = 0; i < BUFFER_LEN; i += 2) 

そして場合あなたは私が示唆したことをして、それぞれの要素が2バイトなので、要素数の半分が必要となります。もちろん、インクリメントするでしょうi 1で

for (int i = 0; i < BUFFER_LEN; ++i) 
0

あなたは、単一のuint16_tに2つのuint8_tの要素を組み合わせることができますbhtshiftingによって:

for (int i = 1; i < BUFFER_LEN + 1; i += 2) { 
    uint16_t pair = data_buffer[i] << 8 | data_buffer[i+1]; 
    LEDState newLEDState = (pair == 0xffff) ? OFF : ON; // replace "LEDState" with the proper type 
    write_led_states(i/2 + 1, newLEDState); 
} 
関連する問題