public override void WriteASCIIString(string value, int length, ASCIIFormat format = ASCIIFormat.Raw) { Assert(length >= 0); byte[] bytes; switch (format) { case ASCIIFormat.Raw: bytes = Encoding.ASCII.GetBytes(value); Array.Resize(ref bytes, length); Write(bytes, 0, bytes.Length); break; case ASCIIFormat.PossiblyNullTerminated: bytes = Encoding.ASCII.GetBytes(value); Array.Resize(ref bytes, length); Write(bytes, 0, bytes.Length); break; //case ASCIIFormat.ZeroPadded: // var zeroIdx = bytes.Length - 1; for (; zeroIdx >= 0 && bytes[zeroIdx] == 0; zeroIdx--) { } // return Encoding.ASCII.GetString(bytes, 0, zeroIdx + 1); default: throw new ArgumentOutOfRangeException(nameof(format), format.ToString()); } }
public string ReadASCIIString(int length, ASCIIFormat format = ASCIIFormat.Raw) { Debug.Assert(length >= 0); var bytes = r.ReadBytes(length); switch (format) { case ASCIIFormat.Raw: return(Encoding.ASCII.GetString(bytes)); case ASCIIFormat.PossiblyNullTerminated: var bytesIdx = bytes.Last() != 0 ? bytes.Length : bytes.Length - 1; return(Encoding.ASCII.GetString(bytes, 0, bytesIdx)); case ASCIIFormat.ZeroPadded: var zeroIdx = bytes.Length - 1; for (; zeroIdx >= 0 && bytes[zeroIdx] == 0; zeroIdx--) { } return(Encoding.ASCII.GetString(bytes, 0, zeroIdx + 1)); default: throw new ArgumentOutOfRangeException("format", format.ToString()); } }
//public abstract long Position { get; } public abstract void WriteASCIIString(string value, int length, ASCIIFormat format = ASCIIFormat.Raw);
public abstract string ReadASCIIString(int length, ASCIIFormat format = ASCIIFormat.Raw);
public static FILEField ReadFILE(this BinaryFileReader r, int length, ASCIIFormat format = ASCIIFormat.PossiblyNullTerminated) => new FILEField { Value = r.ReadASCIIString(length, format) };
public static FILEField ReadFILE(this UnityBinaryReader r, int length, ASCIIFormat format = ASCIIFormat.PossiblyNullTerminated) { return(new FILEField { Value = r.ReadASCIIString(length, format) }); }