Esempio n. 1
0
        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());
        }
Esempio n. 2
0
        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);
        }