2011-02-07 30 views
3

Int32値を3バイト(24ビット)整数に変換する必要があります。エンディアンは変わりませんが、サインを適切に動かす方法はわかりません。値は既に適切な範囲に制限されています。私は4バイトを3に変換する方法を理解できません。C#4.0を使用します。これは、ハードウェアの統合のため、私は24ビットの値を持っている必要があります、32ビットを使用することはできません。Int32から24ビット符号付き整数への変換

+0

ような何かを

必要があるだろうか? –

+0

バイト配列は問題ありません。私はシリアル接続を介して3バイトを出力するので、私はバイトにそれを得ることができる限り、私は行くのがいいです。 – drharris

+0

その3行目は何もしません( 'i&0xffffff'は常に正です)。また、endiannessesの異なるシステムで動作するJoeの答えの2番目の部分に従うこともできます。あなたが持っているコードは今のところ動作しますが、PowerPCやMIPSなどで実行しようとすると異常な方法で壊れます。 –

答えて

1

変換を実行する場合は、4バイト数の先頭バイトを削除します。 2の補数表現は、符号を正しく処理します。 Int32変数に24ビット数値を保存する場合は、v & 0xFFFFFFを使用して下位24ビットを取得できます。私はバイト配列についてのあなたのコメントを見ました:配列にスペースがある場合は、数字の4バイトをすべて書き、最初の3つだけを送ります。それはリトルエンディアンシステムに特有のものです。この発見

+0

情報ありがとうございます。私はそれが典型的に最も重要なビットの中に保持されているので、まだサインについて確信していません。例えば、Console.Write(-42&0xffffff);というコードを試してみてください。または私はここに何かを逃していますか? – drharris

+0

これは符号なしの(符号ビットが最上位バイトにあるので)最下位3バイトを保持します。しかし、マスクを使用しても、AND演算の後に、 '42'と' -42'は異なる結果を生成します。 –

+0

したがって、 'int bit24 = bit32&0xffffff;'を実行してから、否定をテストするなら 'bit24 | = 0x800000;'を実行できますか?基本的には、その符号ビットを手動でリセットしますか? – drharris

2

:あなただけの配列の最後の3つの要素を取得する必要がありますようにhttp://bytes.com/topic/c-sharp/answers/238589-int-byte

int myInt = 800; 
byte[] myByteArray = System.BitConverter.GetBytes(myInt); 

が鳴ります。

EDIT:エレミヤが指摘したように、あなたは、24ビットの整数を格納にどのような種類の予定ですか

int myInt = 800; 
byte[] myByteArray = System.BitConverter.GetBytes(myInt); 

if (BitConverter.IsLittleEndian) { 
    // get the first 3 elements 
} else { 
    // get the last 3 elements 
} 
+0

ドキュメントには、 'GetBytes'の結果がシステムのネイティブエンディアンにあると書かれているので、移植可能であることをテストする必要があることに注意してください。私はあなたがリトルエンディアンの「最後の3」ではなく「最初の3つの要素」を意味すると思います。 –

+0

良い点ですが、3つの回答すべてに同じ欠陥がありますか?または、ロジックが下位レベルで処理されるため、v&0xFFFFFFが機能しますか? – Joe

+1

どのような欠陥がありますか?リトルエンディアンシステムが必要ですか?バイト配列に書き込むすべてのソリューションは、エンディアンチェックを必要とするようです。 'v&0xFFFFFF'は32ビットワード内で行われ、バイトとしてどのように表現されるかを知る必要はありません。 –

関連する問題