2016-09-07 12 views
0

私はバイト配列resultを持っています。 Infoというタイプがすべてintで、バイト配列に変換したいのですが、それらのサイズはすべて異なっています。intを異なるバイト配列のサイズに変換します。

= 4バイト

B = 3バイト

C = 2バイト

D = 1バイト

これは私が試したコードです。

private byte[] getInfoByteArray(Info data) 
{ 
    byte[] result = new byte[10]; 
    BitConverter.GetBytes((data.a)).CopyTo(result, 0); 
    BitConverter.GetBytes((data.b)).CopyTo(result, 4); 
    BitConverter.GetBytes((data.c)).CopyTo(result, 7); 
    result [9] = Convert.ToByte(data.d); 

    return result; 
    } 

ただし、BitConverter.GetBytesは4バイトを返します。

バイト配列に異なるサイズのバイトを得ることができる一般的なソリューションはありますか?

+0

「int」は常に4バイトとして保存されます。 'GetBytes()'は常に4バイトのバイト配列を返すだけではなく、 'int'データ型を使用しているため、これを行うだけです。あなたは、整数値を保持するのに必要な最小バイト数を計算するために[この回答](http://stackoverflow.com/a/11651620/74757)を使うことができます(リストされているように4,3,2,1のサイズを返すと推定される)、最後のバイト配列にコピーする前に '.GetBytes()'の結果をその長さにトリミングします。 –

+1

あなたのフィールドに異なるバイト長が必要な理由は明確ではありません。特に、それらがすべて実際にはint型である場合は特にそうです。 b、c、dの3バイト、2バイト、1バイトしか必要ないと確信できたら、cとdは 'short'と' byte'になります。 bの結果はエンディアンに依存しますが、配列を切り捨てることができます。 'Array.Copy(BitConverter.GetBytes(data.b)、0、result、4,3)'を返します。私。すべてのバイトを必要としない場合は、**すべてのバイトをコピーしない**。 –

答えて

1

使用Array.Copy(Array, Int32, Array, Int32, Int32)方法:

byte[] result = new byte[10]; 
Array.Copy(BitConverter.GetBytes(data.a), 0, result, 0, 4); 
Array.Copy(BitConverter.GetBytes(data.b), 0, result, 4, 3); 
Array.Copy(BitConverter.GetBytes(data.c), 0, result, 7, 2); 
Array.Copy(BitConverter.GetBytes(data.d), 0, result, 9, 1); 

これは、リトルエンディアンのハードウェアを前提としています。あなたのハードウェアがビッグエンディアンの場合、

byte[] result = new byte[10]; 
Array.Copy(BitConverter.GetBytes(data.a), 0, result, 0, 4); 
Array.Copy(BitConverter.GetBytes(data.b), 1, result, 4, 3); 
Array.Copy(BitConverter.GetBytes(data.c), 2, result, 7, 2); 
Array.Copy(BitConverter.GetBytes(data.d), 3, result, 9, 1); 
関連する問題