Loading TestV/Playgrounds/Base64Tool/B64TextEncoding.cs +78 −33 Original line number Diff line number Diff line Loading @@ -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 Loading
TestV/Playgrounds/Base64Tool/B64TextEncoding.cs +78 −33 Original line number Diff line number Diff line Loading @@ -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