2016-10-06 7 views
0

は、例えば:intをサイズ3のバイト配列に変換するには?私はこれが最後のバイトを落とす意味サイズ3のバイト配列にint型に変換する必要が

var temp = BitConverter.GetBytes(myNum).Take(3).ToArray()); 

はしかし、行うには良い方法はありますか?おそらく、カスタム構造体を作成することによって?この要件については

EDIT

私は、この新しいデータ型の16777215の事前に定義された最大値を持っています。あなたは(引用された最大値のみに基づいて)3バイトの符号なし整数を表す新しいstructを作成するように、このような

+3

C#の 'int'のすべての値を3バイトにエンコードすることはできませんので、どちらかの方法で8ビットを失う必要があります"最後のバイト"を削除することは、すべてのビットが代替として良いと思われるか、ビットを落とさないようにする方法があるかどうかを尋ねる "より良い方法"について質問しましたか?代替ソリューションが「最後のバイトを削除する」よりも優れているか悪いのかを判断する方法を明確にしてください。 –

+4

何よりもやっている方がいいですか?私はコードを見ていないし、あなたが達成しようとしていることの説明を見ないので、それを実装する最良の方法が何であるかを伝えることは全く不可能です。 – Esko

+0

これは事実上[彼らの以前のもの](http://stackoverflow.com/q/39891887/73070)へのフォローアップの質問です。 – Joey

答えて

2

サムシング(無LINQの、ちょうどなっバイト)

int value = 123; 

    byte[] result = new byte[] { 
    (byte) (value & 0xFF), 
    (byte) ((value >> 8) & 0xFF), 
    (byte) ((value >> 16) & 0xFF), 
    }; 
1

ね。

元の方法を使用すると、非常に失敗する傾向があります。まず、Take(3)は、実行しているシステムがビッグエンディアンであるかリトルエンディアンであるかによって異なり、第2に、あなたの新しいstructが処理できないマイナスintを渡してください。

あなたが、私はそれがこれらのチェックに合格した場合、それは0と16777215の間だとあなたはそれを保存することができ、与えられたとして、intに取ることは否定だかどうかを確認、それが16777215よりも大きいですかどうかを確認します、変換を自分で記述する必要があります新しいstructでは、エンディアンの問題を回避するためにTake(3)の代わりにWhere(b => b != 0)を実行するだけです。明らかにすべてのバイトが0である0の場合を考慮に入れてください。

関連する問題