C # как записать массив длинного типа в двоичный файл

StackOverflow https://stackoverflow.com/questions/1865824

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть long массив.Как записать этот массив в двоичный файл?Проблема в том, что если я преобразую его в byte массив некоторые значения изменены.

Массив похож на:

long array = new long[160000];

Приведите какой-нибудь фрагмент кода.

Это было полезно?

Решение

Двоичный форматировщик будет самым простым.

Также valuetypes (я предполагаю, что это то, что вы подразумеваете под long), сериализуется очень эффективно.

Другие советы

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);
    }
}

Как изменяются значения?И массив 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();
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top