159 lines
3.3 KiB
C#
159 lines
3.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace BizHawk.Common.IOExtensions
|
|
{
|
|
public static class IOExtensions
|
|
{
|
|
public static byte[] ReadAllBytes(this Stream stream)
|
|
{
|
|
const int BUFF_SIZE = 4096;
|
|
var buffer = new byte[BUFF_SIZE];
|
|
|
|
int bytesRead;
|
|
var inStream = new BufferedStream(stream);
|
|
var outStream = new MemoryStream();
|
|
|
|
while ((bytesRead = inStream.Read(buffer, 0, BUFF_SIZE)) > 0)
|
|
{
|
|
outStream.Write(buffer, 0, bytesRead);
|
|
}
|
|
|
|
return outStream.ToArray();
|
|
}
|
|
|
|
// Read bytes from a BinaryReader and translate them into the UTF-8 string they represent.
|
|
public static string ReadStringFixedAscii(this BinaryReader r, int bytes)
|
|
{
|
|
var read = new byte[bytes];
|
|
r.Read(read, 0, bytes);
|
|
return Encoding.UTF8.GetString(read);
|
|
}
|
|
|
|
public static string ReadStringUtf8NullTerminated(this BinaryReader br)
|
|
{
|
|
MemoryStream ms = new MemoryStream();
|
|
for (; ; )
|
|
{
|
|
var b = br.ReadByte();
|
|
if (b == 0)
|
|
return System.Text.Encoding.UTF8.GetString(ms.ToArray());
|
|
ms.WriteByte(b);
|
|
}
|
|
}
|
|
|
|
public static void CopyTo(this Stream src, Stream dest)
|
|
{
|
|
int size = (src.CanSeek) ? Math.Min((int)(src.Length - src.Position), 0x2000) : 0x2000;
|
|
byte[] buffer = new byte[size];
|
|
int n;
|
|
do
|
|
{
|
|
n = src.Read(buffer, 0, buffer.Length);
|
|
dest.Write(buffer, 0, n);
|
|
} while (n != 0);
|
|
}
|
|
|
|
public static void CopyTo(this MemoryStream src, Stream dest)
|
|
{
|
|
dest.Write(src.GetBuffer(), (int)src.Position, (int)(src.Length - src.Position));
|
|
}
|
|
|
|
public static void CopyTo(this Stream src, MemoryStream dest)
|
|
{
|
|
if (src.CanSeek)
|
|
{
|
|
int pos = (int)dest.Position;
|
|
int length = (int)(src.Length - src.Position) + pos;
|
|
dest.SetLength(length);
|
|
|
|
while (pos < length)
|
|
{
|
|
pos += src.Read(dest.GetBuffer(), pos, length - pos);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
src.CopyTo(dest);
|
|
}
|
|
}
|
|
|
|
public static void Write(this BinaryWriter bw, int[] buffer)
|
|
{
|
|
foreach (int b in buffer)
|
|
{
|
|
bw.Write(b);
|
|
}
|
|
}
|
|
|
|
public static void Write(this BinaryWriter bw, uint[] buffer)
|
|
{
|
|
foreach (uint b in buffer)
|
|
{
|
|
bw.Write(b);
|
|
}
|
|
}
|
|
|
|
public static void Write(this BinaryWriter bw, short[] buffer)
|
|
{
|
|
foreach (short b in buffer)
|
|
{
|
|
bw.Write(b);
|
|
}
|
|
}
|
|
|
|
public static void Write(this BinaryWriter bw, ushort[] buffer)
|
|
{
|
|
foreach (ushort t in buffer)
|
|
{
|
|
bw.Write(t);
|
|
}
|
|
}
|
|
|
|
public static int[] ReadInt32s(this BinaryReader br, int num)
|
|
{
|
|
int[] ret = new int[num];
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
ret[i] = br.ReadInt32();
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
public static short[] ReadInt16s(this BinaryReader br, int num)
|
|
{
|
|
short[] ret = new short[num];
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
ret[i] = br.ReadInt16();
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
public static ushort[] ReadUInt16s(this BinaryReader br, int num)
|
|
{
|
|
ushort[] ret = new ushort[num];
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
ret[i] = br.ReadUInt16();
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
public static void WriteBit(this BinaryWriter bw, Bit bit)
|
|
{
|
|
bw.Write((bool)bit);
|
|
}
|
|
|
|
public static Bit ReadBit(this BinaryReader br)
|
|
{
|
|
return br.ReadBoolean();
|
|
}
|
|
}
|
|
}
|