2014-09-03 59 views
3

我想將ActionScript 3中的函數轉換爲C#.NET。C#的ByteArray類

我遇到的麻煩是如何在C#中正確使用ByteArrays。在As3中有一個特定的類,它已經具有我需要的大部分功能,但在C#中似乎沒有任何類似的東西存在,而且我無法將其包圍。

這是AS3功能:

private function createBlock(type:uint, tag:uint,data:ByteArray):ByteArray 
     { 
      var ba:ByteArray = new ByteArray(); 
      ba.endian = Endian.LITTLE_ENDIAN; 
      ba.writeUnsignedInt(data.length+16); 
      ba.writeUnsignedInt(0x00); 
      ba.writeUnsignedInt(type); 
      ba.writeUnsignedInt(tag); 
      data.position = 0; 
      ba.writeBytes(data); 
      ba.position = 0; 

      return ba; 
     } 

但是從我收集,在C#中我必須使用與字節型正常的陣列,這樣

byte[] ba = new byte[length]; 

現在,我看着進入編碼類,BinaryWriter和BinaryFormatter類,並研究是否有人爲ByteArray創建了類,但沒有運氣。

請問有人能把我推向正確的方向嗎?

+0

什麼是試圖做的功能?可能有更好的選擇 – Sayse 2014-09-03 07:42:57

+0

看一下Stream類。 http://msdn.microsoft.com/en-us/library/system.io.stream(v=vs.110).aspx – ne1410s 2014-09-03 07:43:05

+0

@Sayse它將一個頭添加到定義一些元信息的字節數組。 – DodgerThud 2014-09-03 07:44:04

回答

4

你應該能夠做到這一點使用的MemoryStreamBinaryWriter組合:

public static byte[] CreateBlock(uint type, uint tag, byte[] data) 
{ 
    using (var memory = new MemoryStream()) 
    { 
     // We want 'BinaryWriter' to leave 'memory' open, so we need to specify false for the third 
     // constructor parameter. That means we need to also specify the second parameter, the encoding. 
     // The default encoding is UTF8, so we specify that here. 

     var defaultEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier:false, throwOnInvalidBytes:true); 

     using (var writer = new BinaryWriter(memory, defaultEncoding, leaveOpen:true)) 
     { 
      // There is no Endian - things are always little-endian. 

      writer.Write((uint)data.Length+16); 
      writer.Write((uint)0x00); 
      writer.Write(type); 
      writer.Write(data); 
     } 

     // Note that we must close or flush 'writer' before accessing 'memory', otherwise the bytes written 
     // to it may not have been transferred to 'memory'. 

     return memory.ToArray(); 
    } 
} 

但是請注意,BinaryWriter總是使用小端格式。如果您需要控制此功能,則可以使用Jon Skeet's EndianBinaryWriter代替。

作爲這種方法的替代方法,您可以傳遞流而不是字節數組(可能使用MemoryStream來實現),但是您需要小心生命週期管理,即誰將關閉/處置流它完成了? (你可能不會打擾關閉/配置內存流,因爲它不使用非託管資源,但這不是完全令人滿意的IMO。)

+0

謝謝,你以前的回答已經很完美了。但感謝您添加替代方法。我按照我需要的方式工作。 – DodgerThud 2014-09-03 10:41:01

2

你想要一個字節流,然後從中提取數組它:

using(MemoryStream memory = new MemoryStream()) 
using(BinaryWriter writer = new BinaryWriter(memory)) 
{ 
    // write into stream 
    writer.Write((byte)0); // a byte 
    writer.Write(0f);  // a float 
    writer.Write("hello"); // a string 

    return memory.ToArray(); // returns the underlying array 
} 
+0

這也適用,但馬修有點更快,並提供更多信息。但是謝謝你的幫助。 – DodgerThud 2014-09-03 10:41:53