2009-12-08 56 views
2

我有一個long陣列。如何將這個數組寫入二進制文件? 問題是,如果我把它轉換成byte陣列的一些值的變化。C#如何寫長型數組的二進制文件

陣列是這樣的:

long array = new long[160000]; 

給一些代碼段。

+0

你是什麼意思 「改變」? – 2009-12-08 10:19:04

回答

5

的BinaryFormatter的將是最容易的。

也值類型(我想這是你長的意思),序列化非常有效。

+0

同意二進制格式化程序。 – 2009-12-08 10:14:25

2
var array = new[] { 1L, 2L, 3L }; 
using (var stream = new FileStream("test.bin", FileMode.Create, FileAccess.Write, FileShare.None)) 
using (var writer = new BinaryWriter(stream)) 
{ 
    foreach (long item in array) 
    { 
     writer.Write(item); 
    } 
} 
+0

這將是非常緩慢的,但它的工作:) – leppie 2009-12-08 09:44:43

+0

@leppie,我同意你的看法。我已經執行了一些測量,並且按照您的建議使用'BinaryFormatter'執行得更好。 – 2009-12-08 15:06:18

1

值是如何變化的?一個long數組可以很快被複制到一個byte數組中,而不需要序列化。

static void Main(string[] args) { 

      System.Random random = new Random(); 

      long[] arrayOriginal = new long[160000]; 
      long[] arrayRead = null; 

      for (int i =0 ; i < arrayOriginal.Length; i++) { 
       arrayOriginal[i] = random.Next(int.MaxValue) * random.Next(int.MaxValue); 
      } 

      byte[] bytesOriginal = new byte[arrayOriginal.Length * sizeof(long)]; 
      System.Buffer.BlockCopy(arrayOriginal, 0, bytesOriginal, 0, bytesOriginal.Length); 

      using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) { 

       // write 
       stream.Write(bytesOriginal, 0, bytesOriginal.Length); 

       // reset 
       stream.Flush(); 
       stream.Position = 0; 

       int expectedLength = 0; 
       checked { 
        expectedLength = (int)stream.Length; 
       } 
       // read 
       byte[] bytesRead = new byte[expectedLength]; 

       if (expectedLength == stream.Read(bytesRead, 0, expectedLength)) { 
        arrayRead = new long[expectedLength/sizeof(long)]; 
        Buffer.BlockCopy(bytesRead, 0, arrayRead, 0, expectedLength); 
       } 
       else { 
        // exception 
       } 

       // check 
       for (int i = 0; i < arrayOriginal.Length; i++) { 
        if (arrayOriginal[i] != arrayRead[i]) { 
         throw new System.Exception(); 
        } 
       } 
      } 

      System.Console.WriteLine("Done"); 
      System.Console.ReadKey(); 
     }