Как сохранить байтовый массив [] [] в файл? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь загрузить список байтовых массивов, но тип byte[][], который затем вызывает проблему при попытке создать файл, потому что он ожидает byte[]

byte[][] imgdata = image.ImageByteArrayList;
using (FileStream file = new FileStream(FileNameLocation, FileMode.Create, System.IO.FileAccess.Write))
{
    file.Write(imgdata, 0, imgdata.Length); //error here
    file.Flush();
    file.Close();
    file.Dispose();
}

Есть лиспособ конвертировать byte[][] в byte[]? Или есть другой способ скачать?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Это делает то, что вы хотите, записывая каждую строку данных изображения по очереди в выходной файл:

byte[][] imgdata = image.ImageByteArrayList;
using (FileStream file = new FileStream(FileNameLocation, FileMode.Create, System.IO.FileAccess.Write))
{
    for (int i = 0;  i < imgdata.Length;  i++)
        file.Write(imgdata[i], 0, imgdata[i].Length);   // Write a row of bytes
    file.Flush();
    file.Close();
    file.Dispose();
}

Это дает преимущество в использовании массива изображения на месте, без необходимости преобразованияэто в другой одномерный массив (который может быть довольно дорогим).

0 голосов
/ 07 ноября 2019

JaggedArrayHelper класс для сохранения и загрузки зубчатого массива байтов [] []

static public class JaggedArrayHelper
{
  static public void Save(string filename, byte[][] array)
  {
    using ( var file = new FileStream(filename, FileMode.Create, FileAccess.Write) )
    {
      foreach ( var row in array )
      {
        var sizeRow = BitConverter.GetBytes(row.Length);
        file.Write(sizeRow, 0, sizeRow.Length);
        file.Write(row, 0, row.Length);
      }
      file.Flush();
      file.Close();
    }
  }
  static public byte[][] Load(string filename)
  {
    var array = new byte[0][];
    using ( var file = new FileStream(filename, FileMode.Open, FileAccess.Read) )
    {
      int countRead;
      int countItems;
      int sizeInt = sizeof(int);
      var sizeRow = new byte[sizeInt];
      while ( true )
      {
        countRead = file.Read(sizeRow, 0, sizeInt);
        if ( countRead != sizeInt )
          break;
        countItems = BitConverter.ToInt32(sizeRow, 0);
        var data = new byte[countItems];
        countRead = file.Read(data, 0, countItems);
        if ( countRead != countItems )
          break;
        Array.Resize(ref array, array.Length + 1);
        array[array.Length - 1] = data;
      }
      file.Close();
    }
    return array;
  }
}

Test

static void TestJaggedArray()
{
  string filename = "c:\\test.bin";

  byte[][] data = new byte[4][];

  data[0] = new byte[] { 10, 20, 30, 40, 50 };
  data[1] = new byte[] { 11, 21, 31, 41, 51, 61, 71, 71, 81, 92 };
  data[2] = new byte[] { 12, 22, 32 };
  data[3] = new byte[] { 13, 23, 33, 43, 53, 63, 73 };

  Action print = () =>
  {
    foreach ( var row in data )
    {
      Console.Write("  ");
      foreach ( var item in row )
        Console.Write(item + " ");
      Console.WriteLine();
    }
  };

  Console.WriteLine("Jagged array before save:");
  print();
  JaggedArrayHelper.Save(filename, data);

  data = JaggedArrayHelper.Load(filename);
  Console.WriteLine();
  Console.WriteLine("Jagged array after load:");
  print();
}

Вывод

Jagged array before save:
  10 20 30 40 50
  11 21 31 41 51 61 71 71 81 92
  12 22 32
  13 23 33 43 53 63 73

Jagged array after load:
  10 20 30 40 50
  11 21 31 41 51 61 71 71 81 92
  12 22 32
  13 23 33 43 53 63 73

Будущие улучшения

Мы можем добавить некоторые поля, чтобы определить заголовок, который поможет распознатьописание и тип файла, например JaggedBytesArray.

Мы также можем управлять случаем, когда считываемые данные не соответствуют предполагаемому количеству и показывают сообщение или вызывают исключение в дополнение к разрыву цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...