public static string PrettifyDensity(DensitySupportHeader?density) { if (density == null) { return(null); } DensitySupportHeader decoded = density.Value; var sb = new StringBuilder(); foreach (DensitySupportDescriptor descriptor in decoded.descriptors) { sb.AppendFormat("Density \"{0}\" defined by \"{1}\".", descriptor.name, descriptor.organization). AppendLine(); sb.AppendFormat("\tPrimary code: {0:X2}h", descriptor.primaryCode).AppendLine(); if (descriptor.primaryCode != descriptor.secondaryCode) { sb.AppendFormat("\tSecondary code: {0:X2}h", descriptor.secondaryCode).AppendLine(); } if (descriptor.writable) { sb.AppendLine("\tDrive can write this density"); } if (descriptor.duplicate) { sb.AppendLine("\tThis descriptor is duplicated"); } if (descriptor.defaultDensity) { sb.AppendLine("\tThis is the default density on the drive"); } sb.AppendFormat("\tDensity has {0} bits per mm, with {1} tracks in a {2} mm width tape", descriptor.bpmm, descriptor.tracks, descriptor.width / (double)10).AppendLine(); sb.AppendFormat("\tDensity maximum capacity is {0} megabytes", descriptor.capacity).AppendLine(); sb.AppendFormat("\tDensity description: {0}", descriptor.description).AppendLine(); sb.AppendLine(); } return(sb.ToString()); }
public static DensitySupportHeader?DecodeDensity(byte[] response) { if (response == null) { return(null); } if (response.Length <= 56) { return(null); } ushort responseLen = (ushort)((response[0] << 8) + response[1] + 2); if (response.Length != responseLen) { return(null); } List <DensitySupportDescriptor> descriptors = new List <DensitySupportDescriptor>(); int offset = 4; while (offset < response.Length) { var descriptor = new DensitySupportDescriptor { primaryCode = response[offset + 0], secondaryCode = response[offset + 1], writable = (response[offset + 2] & 0x80) == 0x80, duplicate = (response[offset + 2] & 0x40) == 0x40, defaultDensity = (response[offset + 2] & 0x20) == 0x20, reserved = (byte)((response[offset + 2] & 0x1E) >> 1), lenvalid = (response[offset + 2] & 0x01) == 0x01, len = (ushort)((response[offset + 3] << 8) + response[offset + 4]), bpmm = (uint)((response[offset + 5] << 16) + (response[offset + 6] << 8) + response[offset + 7]), width = (ushort)((response[offset + 8] << 8) + response[offset + 9]), tracks = (ushort)((response[offset + 10] << 8) + response[offset + 11]), capacity = (uint)((response[offset + 12] << 24) + (response[offset + 13] << 16) + (response[offset + 14] << 8) + response[offset + 15]) }; byte[] tmp = new byte[8]; Array.Copy(response, offset + 16, tmp, 0, 8); descriptor.organization = StringHandlers.CToString(tmp).Trim(); tmp = new byte[8]; Array.Copy(response, offset + 24, tmp, 0, 8); descriptor.name = StringHandlers.CToString(tmp).Trim(); tmp = new byte[20]; Array.Copy(response, offset + 32, tmp, 0, 20); descriptor.description = StringHandlers.CToString(tmp).Trim(); if (descriptor.lenvalid) { offset += descriptor.len + 5; } else { offset += 52; } descriptors.Add(descriptor); } var decoded = new DensitySupportHeader { length = responseLen, reserved = (ushort)((response[2] << 8) + response[3] + 2), descriptors = descriptors.ToArray() }; return(decoded); }