2011-06-13 49 views
1

是新的C#,所以我真的不知道該怎麼做,但在C++中我是這樣做這樣不能鍵入「字節」轉換爲「T」

template <typename T> writeInt(int location, T value){ 
    *(T*)&buffer[location] = value; 
} 

在C#中我試圖做同樣

public void WriteInt<T>(int location,T value) 
     { 
      (T)buffer[location] = value; 
     } 

但我歌廳這個錯誤Cannot convert type 'byte' to 'T' ,所以我怎麼能做到這一點,得益於

+4

你想做什麼?什麼是'T'?什麼是'buffer []'?看起來您可能需要堅持使用C++或重新調整C#中正常的視圖! – 2011-06-13 18:32:50

+0

@David Heffernan所以我可以說WriteInt 或32 etc,buffer = byte [] – Abanoub 2011-06-13 18:34:09

+0

你看過C#中的泛型(http://msdn.microsoft.com/en-us/library/ms379564(VS)。 80)的.aspx)? – yasouser 2011-06-13 18:34:52

回答

0

,所以我可以說WriteInt或32 etc,buffer = byte []

在這兩種情況下你都不會被允許。

如果緩衝字節數組那麼你需要隱蔽的字節數組來代替。

5

首先,

你或許應該使用一個MemoryStreamBinaryWriter寫原始類型到一個緩衝區。你可以像建議的那樣使用BitConverter這個類,但是最終你會得到很多中間對象。

byte[] buffer; 

int value1 = 10; 
double value2 = 20; 
string value3 = "foo"; 

using(var ms = new System.IO.MemoryStream()) 
{ 
    using(var writer = new System.IO.BinaryWriter(ms)) 
    { 
     writer.Write(value1); 
     writer.Write(value2); 
     writer.Write(value3); 
    } 
} 

buffer = ms.ToArray(); 

value1value2value3在這裏只是一個例子向您展示一對夫婦提供的各種重載的,你應該看看the MSDN page on BinaryWriter獲取更多信息)

更重要的是,

你在你的C++代碼中使用指針算術; C#只在unsafe塊中運行時才提供真正的指針功能,如果可能(應該在此處),應該避免這種情況。 .NET在引用上工作,而不是指針,所以你沒有太多的控制實際的內存分配。

長話短說,你不能做你想要做的事情。

2

做你想要什麼,我相信你需要做這樣的事情:

byte[] buffer = new byte[8192] ; 
void WriteInt<T>(int offset , T value) 
{ 
    Type  tBitConvert = typeof(BitConverter) ; 
    MethodInfo getBytes = tBitConvert.GetMethod("GetBytes" , 
          BindingFlags.Static|BindingFlags.Public , 
          Type.DefaultBinder , new Type[]{ typeof(T) } , 
          null 
          ) ; 

    if (getBytes == null) throw new InvalidOperationException("invalid type") ; 

    byte[] octets = (byte[]) getBytes.Invoke(null, new object[]{ value }) ; 

    Array.Copy(octets , 0 , buffer , offset , octets.Length) ; 
    return ; 
} 

但我想你,你會更好—肯定更地道—如果你只是用System.IO.BinaryStream,將其分類以提供您似乎想要的緩衝。

+0

創造性的要點,但我不認爲指出某個剛剛接觸.NET的人(並且只是試圖按照他們習慣的方式做某件事)而走向這樣的道路並不明智。 – 2011-06-13 19:31:29

+0

因此,我建議只使用'BinaryStream'。 – 2011-06-13 19:45:14

相關問題