C # cómo escribir tipo array largo de archivo binario
-
18-09-2019 - |
Pregunta
Tengo una matriz long
. Cómo escribir esta matriz a un archivo binario?
El problema es que si me convierto en una matriz byte
algunos valores se cambian.
La matriz es como:
long array = new long[160000];
Piense un poco fragmento de código.
Solución
El BinaryFormatter será el más fácil.
También valuetypes (supongo que esto es lo que entendemos por tiempo), Serializa de manera muy eficiente.
Otros consejos
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);
}
}
¿Cómo se cambian los valores? Y una serie de tiempo puede ser copiada en una matriz de bytes muy rápidamente, sin necesidad de serialización.
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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow