Commit 982cb02c authored by shrabbit's avatar shrabbit
Browse files

Add Decoder class and refactor argument parsing in B64TextEncoding playground

parent e4508a58
Loading
Loading
Loading
Loading
+78 −33
Original line number Diff line number Diff line
@@ -17,46 +17,91 @@ public class B64TextEncoding
                                              "  可选字节序:\n" + 
                                              "    --le:小端序\n" + 
                                              "    --be:大端序(默认)\n" +
                                              "  可选字节序标记:" +
                                              "    --bom:带字节序标记" +
                                              "  可选字节序标记:\n" +
                                              "    --bom:带字节序标记\n" +
                                              "    不填:不带字节序标记(默认)";
        public Task Run(string[] args)
        {
            if (Errors.ValidArgsLength(args, 1))
            {
                var text = args[0];
                var encoderArg = args.Length > 1 ? args[1].ToLower() : "--u8";
                var orderArg = args.Length > 2 ? args[2].ToLower() : "--be";
                var bomArg = args.Length > 3 ? args[3].ToLower() : string.Empty;
            if (!TryGetEncodingFromArgs(args, out var encoder, out var text))
                return Task.CompletedTask;

                if (Errors.ValidArrowsArgWithName(encoderArg, "Encoder", "--u8", "--u16") &&
                    Errors.ValidArrowsArgWithName(orderArg, "Order", "--le", "--be") &&
                    Errors.ValidArrowsArgWithName(bomArg, "BOM", "--bom", string.Empty))
                {
                    var isBigEndian = orderArg switch
                    {
                        "--be" => true,
                        _ => false
                    };
            // 正向:字符串 -> 字节 -> Base64
            AnsiConsole.MarkupLine("[green]Encoded:[/]");
            AnsiConsole.WriteLine(Convert.ToBase64String(encoder.GetBytes(text)));
            AnsiConsole.WriteLine();

                    var isBom = bomArg switch
            return Task.CompletedTask;
        }
    }

    public class Decoder : IPlayground
    {
                        "--bom" => true,
                        _ => false
                    };
        public string LaunchCmd { get; } = "atob";
        public string? Name { get; } = "Base64String To String";
        public string? Description { get; } = "atob [Base64String] <Encoder> <Order> <BOM>\n" +
                                              "  注意:解码时的编码器、字节序、BOM 参数必须与编码时完全一致,否则会乱码或报错。\n" +
                                              "  可选参数同 btoa 命令。";
        public Task Run(string[] args)
        {
            if (!TryGetEncodingFromArgs(args, out var encoder, out var base64Text))
                return Task.CompletedTask;

                    Encoding encoder = encoderArg switch
            try
            {
                        "--u16" => new UnicodeEncoding(isBigEndian, isBom),
                        _ => new UTF8Encoding(isBigEndian, isBom)
                    };
                // 反向:Base64 -> 字节 -> 字符串
                byte[] bytes = Convert.FromBase64String(base64Text);
                string decodedText = encoder.GetString(bytes);
                
                    AnsiConsole.WriteLine(Convert.ToBase64String(encoder.GetBytes(text)));
                AnsiConsole.MarkupLine("[green]Decoded:[/]");
                // 使用 Markup 转义输出,防止解码出的字符串包含 Spectre.Console 的 [ ] 标记导致颜色错乱
                AnsiConsole.MarkupLine(Markup.Escape(decodedText)); 
                AnsiConsole.WriteLine();
            }
            catch (FormatException)
            {
                AnsiConsole.MarkupLine("[red]错误:输入的不是有效的 Base64 字符串。[/]\n");
            }
            catch (Exception ex)
            {
                AnsiConsole.MarkupLine($"[red]错误:解码失败 ({ex.Message})。请检查编码器/字节序参数是否与编码时一致。[/]\n");
            }

            return Task.CompletedTask;
        }
    }

    /// <summary>
    /// 提取的公共逻辑:解析参数并构建对应的 Encoding 对象
    /// </summary>
    private static bool TryGetEncodingFromArgs(string[] args, out Encoding encoder, out string payload)
    {
        encoder = Encoding.Default!; // 编译器要求初始化,实际会在下方被覆盖
        payload = string.Empty;

        if (!Errors.ValidArgsLength(args, 1))
            return false;

        payload = args[0];
        var encoderArg = args.Length > 1 ? args[1].ToLower() : "--u8";
        var orderArg = args.Length > 2 ? args[2].ToLower() : "--be";
        var bomArg = args.Length > 3 ? args[3].ToLower() : string.Empty;

        if (!Errors.ValidArrowsArgWithName(encoderArg, "Encoder", "--u8", "--u16") ||
            !Errors.ValidArrowsArgWithName(orderArg, "Order", "--le", "--be") ||
            !Errors.ValidArrowsArgWithName(bomArg, "BOM", "--bom", string.Empty))
        {
            return false;
        }

        bool isBigEndian = orderArg == "--be";
        bool isBom = bomArg == "--bom";

        encoder = encoderArg switch
        {
            "--u16" => new UnicodeEncoding(isBigEndian, isBom),
            _ => new UTF8Encoding(isBigEndian, isBom) // 注意:UTF-8 标准不区分大小端,这里传参仅为了保持签名一致
        };

        return true;
    }
}
 No newline at end of file