2009-03-27 4 views
0

しばらく前に別の質問をしました(Click here to view the question)。あなたが私を与えたそのソースファイルを使用している場合C#:DynamicCastHelperで配列を構造体に移動すると問題が発生しました

は、これは私の問題です:

構造体を宣言するための他の方法を見つけることができなかったため、フグarray.Iの、「安全でない」としてマークされている
public unsafe struct tPacket_5000_E 
{ 
    public Int16 size; 
    public Int16 opcode; 
    public byte securityCount; 
    public byte securityCRC; 
    public byte flag; 
    fixed byte blowfish[8]; //Please NOTE THIS 
    public Int32 seedCount; 
    public Int32 seedCRC; 
public fixed Int32 securityseed[19]; 
}; 

構造体内の配列。

問題:パケットをその構造体に解析すると、関数はblowfish [8]に何も入れません。それは存在しません。代わりに、blowfishやsecurityseedの代わりにseedCountとseedCRCにバイトを入れます。 彼らは常に空です

これは私のコードです:

tPacket_5000_E packet = new tPacket_5000_E(); 
packet = (tPacket_5000_E)CDynamicCastHelper.CastIntoFields(packet, data2, CastOptions.ReverseDWord | CastOptions.ReverseDWord); 

なぜそれが配列のために動作しませんか?それは安全でないからですか?

ありがとうございます!

答えて

1

代わりにMarshalAs属性を見てください。

+0

私は間違っていますが、私はどこを見ますか? –

+0

ここですばやく検索すると、回答が得られます。 – leppie

+0

もし私がこれを書いているなら、 [MarshalAsAttribute(UnmanagedType.ByValArray、SizeConst = 8)] パブリックバイト[]ブローフィッシュ; CDynamicCastHelper.csにクラッシュする –

0

DynamicCastHelperはDynamicCastHelperSizeAttribute属性を使用して、配列フィールドのサイズを指定します。固定する必要はありません。それは、構造体/クラスのフィールドが何であるかを調べるためにReflectionを使用し、上記の属性は配列のサイズを示します。

CDynamicCastHelper.csが動作するには、いくつかの変更が必要です。 (a)Reflectionは、バイトまたはバイト[]がそれぞれSystem.ByteおよびSystem.Byte []であることを示します。 コードが "byte []"型を探しているところで、これを "System.Byte []"に変更します。 System.Byteはバイトのに相当します。 (b)_GenerateFieldsCast関数では、各フィールドがクラスかプリミティブ型かをチェックします。 System.Byte []はtrueにIsClass等しい持っているので、明示的System.Byte []は(バイナリリーダーがそれに直接読み込まれるように)プリミティブ型として扱うことを強制する必要がある:

if (objField.FieldType.IsClass && objField.FieldType != typeof(System.Byte[])) 

例使用法:

public class SampleClass2b 
{ 
    public Int16 a; 
    [DynamicCastHelperSizeAttribute(5)] 
    public byte[] ba; //{ get; set; } 
    [DynamicCastHelperSizeAttribute(4)] 
    public byte[] bb; //{ get; set; } 
    public Int32 c; 
} 
byte[] data2b = new byte[] { 0, 17, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 10 }; 
SampleClass2b clas2b = new SampleClass2b(); 
CDynamicCastHelper.CastIntoFields(clas2b, data2b, CastOptions.ReverseDWord | CastOptions.ReverseWord); 
関連する問題