2

NXC で符号付き整数をバイト配列に変換する方法はありますか? 言語の制限により、明示的な型キャストやポインターも使用できません。

私はもう試した:

for(unsigned long i = 1; i <= 2; i++)
{
    MM_mem[id.idx] = ((val & (0xFF << ((2 - i) * 8)))) >> ((2 - i) * 8));

    id.idx++;
}

しかし、それは失敗します。

編集:これは機能します...ダウンロードしていませんでした。私はそれを理解しようとして約1時間を無駄にしました。>_>


編集: NXC では>>、算術シフトです。int符号付き 16 ビット整数型です。Abyteと同じものですunsigned char


NXC は'Not eXactly C'で、C の親戚ですが、C とは明らかに異なります。

4

3 に答える 3

4

どうですか

    unsigned char b[4];

    b[0] = (x & 0xFF000000) >> 24;
    b[1] = (x & 0x00FF0000) >> 16;
    b[2] = (x & 0x0000FF00) >> 8;
    b[3] = x & 0xFF;
于 2011-04-25T05:56:55.963 に答える
2

とタグ付けされた質問; この回答は、NoteXactlyCには当てはまらない場合があります。

これの問題は何ですか:

int value;
char bytes[sizeof(int)];

bytes[0] = (value >>  0) & 0xFF;
bytes[1] = (value >>  8) & 0xFF;
bytes[2] = (value >> 16) & 0xFF;
bytes[3] = (value >> 24) & 0xFF;

展開されたループと見なすことができます。ゼロによるシフトは省略できます。オプティマイザは確かにそうします。負の値を右シフトした結果は定義されていませんが、このコードは動作が定義されているビットにのみアクセスするため、問題はありません。

このコードは、バイトをリトルエンディアンの順序で指定します。最下位バイトはにありbytes[0]ます。明らかに、ビッグエンディアンの順序は次の方法で実現されます。

int value;
char bytes[sizeof(int)];

bytes[3] = (value >>  0) & 0xFF;
bytes[2] = (value >>  8) & 0xFF;
bytes[1] = (value >> 16) & 0xFF;
bytes[0] = (value >> 24) & 0xFF;
于 2011-04-25T05:57:15.537 に答える
2

基盤となるVMで使用可能なオペコードを使用してNXCでこれを行う最良の方法は、FlattenVarを使用して任意のタイプを文字列(末尾にnullが追加されたバイト配列)に変換することです。その結果、単一のVMオペコード操作が発生し、シフトと論理ANDおよび配列操作を使用する上記のオプションのいずれかで数十行のアセンブリ言語が必要になります。

task main()
{
  int x = Random(); // 16 bit random number - could be negative
  string data;
  data = FlattenVar(x); // convert type to byte array with trailing null
  NumOut(0, LCD_LINE1, x);
  for (int i=0; i < ArrayLen(data)-1; i++)
  {
#ifdef __ENHANCED_FIRMWARE
    TextOut(0, LCD_LINE2-8*i, FormatNum("0x%2.2x", data[i]));
#else
    NumOut(0, LCD_LINE2-8*i, data[i]);
#endif
  }
  Wait(SEC_4);
}

レゴマインドストームとNXTおよびNoteXactlyCのヘルプを入手する最良の方法は、http://forums.mindboards.net/のマインドボードフォーラムを経由することです

于 2011-04-25T15:37:54.510 に答える