2016-10-18 4 views
0

私はデータバッファとして使用しているbyte []オブジェクトを持っています。C#では、新しい配列を作成せずにバイト配列を別の型にキャストすることは可能ですか?

メモリのbyte []データを複製せずに、プリミティブ/非プリミティブ構造体の配列として "読み込み"たいと思っています。

目標はなりような何か:

byte[] myBuffer; 

//Buffer is populated 

int[] asInts = PixieDust_ToInt(myBuffer); 
MyStruct[] asMyStructs = PixieDust_ToMyStruct(myBuffer); 

これは可能ですか?もしそうなら、どうですか?

+0

構造体へのポインタにCでのボイドポインタをキャストような?いいえ。 –

+1

[管理対象構造体へのバイト配列のキャスト]の可能な複製(http://stackoverflow.com/questions/6335153/casting-a-byte-array-to-a-aged-structure)。基本的にストリームに変換して読み込みます。 – MickyD

+0

[C# - バイト配列を構造体の配列にキャストしたり、その逆(逆の場合)]の可能な複製(http://stackoverflow.com/questions/17840552/c-sharp) -cast-a-byte-array-of-struct-and-versa-reverse) –

答えて

1

これを行うことはできません。 MyStruct[]を使用するには、そのような配列を実際に作成し、データをコピーする必要があります。理論的には、コレクションとして機能する独自のカスタムタイプを作成することはできますが、実際にはbyte[]のファサードであって、特定の値がアクセスされたときにオブジェクトをstructにコピーしてしまいます。最終的にすべての同じデータをコピーしてしまうことになります。実際には少数の値しか使用しない場合には、少し遅らせることができます。

+0

思ったこと、ありがとう! – user3689186

0

あなたが他の塩基の種類に[]バイトを変換するために取得する最も近い

Byte[] b = GetByteArray(); 

using(BinaryReader r = new BinaryReader(new MemoryStream(b))) 
{ 
    r.ReadInt32(); 
    r.ReadDouble(); 
    r.Read...(); 
} 

である任意の種類のオブジェクトに[]バイトを変換する簡単な方法は、[]がありません

0

クラスSystem.BitConverter

検討このクラス等のInt32、Int64の、ダブル、ブール値として指定されたインデックスから開始し、バックこれらのタイプのバイトシーケンスにバイトを再解釈する機能を有します。

例:

int32 x = 0x12345678; 
var xBytes = BitConverter.GetBytes(x); 
// bytes is a byte array with length 4: 0x78; 0x56; 0x34; 0x12 
var backToInt32 = BitConverter.ToInt32(xBytes, 0); 

またはあなたの配列が混合データが含まれている場合:

double d = 3.1415; 
int16 n = 42; 
Bool b = true; 
Uint64 u = 0xFEDCBA; 

// to array of bytes: 
var dBytes = BitConverter.GetBytes(d); 
var nBytes = BitConverter.GetBytes(n); 
var bBytes = BitConverter.GetBytes(b); 
var uBytes = BitConterter.GetBytes(u); 
Byte[] myBytes = dBytes.Concat(nBytes).Concat(bBytes).Concat(uBytes).ToArray(); 

// startIndexes in myBytes: 
int startIndexD = 0; 
int startIndexN = dBytes.Count(); 
int startIndexB = startIndexN + nBytes.Count(); 
int startIndexU = startIndexB + bBytes.Count(); 

// back to original elements 
double dRestored = Bitconverter.ToDouble(myBytes, startIndexD); 
int16 nRestored = BitConverter.ToInt16(myBytes, startIndexN); 
bool bRestored = BitConverter.ToBool(myBytes, startIndexB); 
Uint64 uRestored = BitConverter.ToUint64(myBytes, startIndexU); 
関連する問題