public static string ReadNullTerminatedString(this byte[] bytes, int offset = 0) { var index = 0; for (index = offset; index < bytes.Length; index++) { if (bytes[index] == 0) { break; } } var length = index - offset; if (length <= 0) { return(string.Empty); } var stringBytes = new byte[length]; Array.Copy(bytes, offset, stringBytes, 0, length); return(LittleEndianConverter.ConvertToIso88591String(stringBytes)); }
public static async Task <RootBlock> Parse(byte[] blockBytes) { var blockStream = new MemoryStream(blockBytes); var diskType = await blockStream.ReadInt32(); if (diskType != 0x50465301) { throw new IOException("Invalid root block"); } var options = await blockStream.ReadUInt32(); var datestamp = await blockStream.ReadUInt32(); /* current datestamp */ var creationDay = await blockStream.ReadUInt16(); /* days since Jan. 1, 1978 (like ADOS; WORD instead of LONG) */ var creationMinute = await blockStream.ReadUInt16(); /* minutes past modnight */ var creationTick = await blockStream.ReadUInt16(); /* ticks past minute */ var protection = await blockStream.ReadUInt16(); /* protection bits (ala ADOS) */ var diskNameLength = blockStream.ReadByte(); /* disk label (pascal string) */ var diskNameBytes = await blockStream.ReadBytes(31); var diskName = LittleEndianConverter.ConvertToIso88591String(diskNameBytes, diskNameLength); var lastReserved = await blockStream.ReadUInt32(); /* reserved area. sector number of last reserved block */ var firstReserved = await blockStream.ReadUInt32(); /* sector number of first reserved block */ var reservedFree = await blockStream.ReadUInt32(); /* number of reserved blocks (blksize blocks) free */ var reservedBlkSize = await blockStream.ReadUInt16(); /* size of reserved blocks in bytes */ var rBlkCluster = await blockStream.ReadUInt16(); /* number of sectors in rootblock, including bitmap */ var blocksFree = await blockStream.ReadUInt32(); /* blocks free */ var alwaysFree = await blockStream.ReadUInt32(); /* minimum number of blocks free */ var rovingPtr = await blockStream.ReadUInt32(); /* current LONG bitmapfield nr for allocation */ var delDir = await blockStream.ReadUInt32(); /* deldir location (<= 17.8) */ var diskSize = await blockStream.ReadUInt32(); /* disksize in sectors */ var extension = await blockStream.ReadUInt32(); /* rootblock extension (16.4) offset=88 $58 */ var notUsed = await blockStream.ReadUInt32(); return(new RootBlock { DiskName = diskName, BlocksFree = blocksFree, AlwaysFree = alwaysFree, DiskSize = diskSize }); }
public static async Task <string> ReadNullTerminatedString(this Stream stream) { var stringBytes = new List <byte>(); byte[] buffer = new byte[1]; int bytesRead; do { bytesRead = await stream.ReadAsync(buffer, 0, 1); if (bytesRead == 1 && buffer[0] != 0) { stringBytes.Add(buffer[0]); } } while (bytesRead == 1 && buffer[0] != 0); return(LittleEndianConverter.ConvertToIso88591String(stringBytes.ToArray())); }
public static async Task <string> ReadString(this Stream stream, int length) { return(LittleEndianConverter.ConvertToIso88591String(await stream.ReadBytes(length))); }