public DuckyDirectory Extract(SequentialReader reader)
        {
            var directory = new DuckyDirectory();

            try
            {
                while (true)
                {
                    var tag = reader.GetUInt16();

                    // End of Segment is marked with zero
                    if (tag == 0)
                    {
                        break;
                    }

                    var length = reader.GetUInt16();

                    switch (tag)
                    {
                    case DuckyDirectory.TagQuality:
                    {
                        if (length != 4)
                        {
                            directory.AddError("Unexpected length for the quality tag");
                            return(directory);
                        }
                        directory.Set(tag, reader.GetUInt32());
                        break;
                    }

                    case DuckyDirectory.TagComment:
                    case DuckyDirectory.TagCopyright:
                    {
                        reader.Skip(4);
                        directory.Set(tag, reader.GetString(length - 4, Encoding.BigEndianUnicode));
                        break;
                    }

                    default:
                    {
                        // Unexpected tag
                        directory.Set(tag, reader.GetBytes(length));
                        break;
                    }
                    }
                }
            }
            catch (IOException e)
            {
                directory.AddError(e.Message);
            }

            return(directory);
        }
        public DuckyDirectory Extract(SequentialReader reader)
        {
            var directory = new DuckyDirectory();

            try
            {
                while (true)
                {
                    var tag = reader.GetUInt16();

                    // End of Segment is marked with zero
                    if (tag == 0)
                        break;

                    var length = reader.GetUInt16();

                    switch (tag)
                    {
                        case DuckyDirectory.TagQuality:
                        {
                            if (length != 4)
                            {
                                directory.AddError("Unexpected length for the quality tag");
                                return directory;
                            }
                            directory.Set(tag, reader.GetUInt32());
                            break;
                        }
                        case DuckyDirectory.TagComment:
                        case DuckyDirectory.TagCopyright:
                        {
                            reader.Skip(4);
                            directory.Set(tag, reader.GetString(length - 4, Encoding.BigEndianUnicode));
                            break;
                        }
                        default:
                        {
                            // Unexpected tag
                            directory.Set(tag, reader.GetBytes(length));
                            break;
                        }
                    }
                }
            }
            catch (IOException e)
            {
                directory.AddError(e.Message);
            }

            return directory;
        }