You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从C#项目XML资源中还原Base64编码的GIF文件

问题描述

现有一个作为C#项目资源的happy_face.xml,格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <file name="happy_face.gif">
R0lGODlhEAAQAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAAQABAAAAhTAP8JFIiioMGBCAnqW8gQRUKFDCM6RIhiYUWLDQderMhR30WP/z527NjwY8STFk2ilLjRoEuRMF+yZGnwpMOYKieGLGlSJ0SPEh/utCmU4MuEAQEAOw==
</file>
</root>

该XML存储了16x16的GIF图像的Base64编码数据,文件名由file节点的name属性指定。需要实现代码从程序集读取该XML资源,将Base64解码后的内容保存为同名GIF文件到程序EXE所在目录。以下是两段未完成的代码,请求完善:

未完成的尝试1

namespace WpfApp1 {
    static class MyXMLTools {

        // Read XML from EXE assembly and 
        // Save XML stored binary file to the local disk
        public static void XmlExtract(
            string NAME = "WpfApp1.happy_face.xml") 
        {
            Assembly assembly = Assembly.GetExecutingAssembly();
            
            
            using(Stream stream 
                    = assembly.GetManifestResourceStream(NAME)) {
               using (StreamReader reader
                   = new StreamReader(stream)) {
                  /// ????
                  /// ???
               }
            }
        }

    } // class
} // namespace

未完成的尝试2

namespace WpfApp1 {
    static class MyXMLTools {

        // Read XML from EXE assembly and 
        // Save XML stored binary file to the local disk
        public static void XmlExtract(
            string NAME = "WpfApp1.happy_face.xml") 
        {
            Assembly assembly = Assembly.GetExecutingAssembly();            
            Stream stream 
                      = assembly.GetManifestResourceStream(NAME);
            XmlDocument mapfile = new XmlDocument();
            mapfile.Load(stream);
            stream.Close();

           // ??? ???
        }
    }
}

完善后的代码

版本1:基于StreamReader读取XML内容后解析

using System;
using System.IO;
using System.Reflection;
using System.Xml;

namespace WpfApp1 {
    static class MyXMLTools {
        // 从程序集读取XML资源,解码并保存内嵌的GIF文件
        public static void XmlExtract(string NAME = "WpfApp1.happy_face.xml") {
            Assembly assembly = Assembly.GetExecutingAssembly();
            
            using(Stream stream = assembly.GetManifestResourceStream(NAME)) {
                using (StreamReader reader = new StreamReader(stream)) {
                    // 读取完整XML文本
                    string xmlContent = reader.ReadToEnd();
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(xmlContent);
                    
                    // 定位到file节点
                    XmlNode fileNode = doc.SelectSingleNode("//file");
                    if (fileNode == null) return;
                    
                    // 获取目标文件名
                    string fileName = fileNode.Attributes["name"]?.Value;
                    if (string.IsNullOrEmpty(fileName)) return;
                    
                    // 提取并解码Base64数据
                    string base64Data = fileNode.InnerText.Trim();
                    byte[] imageBytes = Convert.FromBase64String(base64Data);
                    
                    // 拼接保存路径(EXE所在目录)
                    string savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
                    File.WriteAllBytes(savePath, imageBytes);
                }
            }
        }
    }
}

版本2:直接用XmlDocument加载流

using System;
using System.IO;
using System.Reflection;
using System.Xml;

namespace WpfApp1 {
    static class MyXMLTools {
        // 从程序集读取XML资源,解码并保存内嵌的GIF文件
        public static void XmlExtract(string NAME = "WpfApp1.happy_face.xml") {
            Assembly assembly = Assembly.GetExecutingAssembly();            
            using (Stream stream = assembly.GetManifestResourceStream(NAME)) {
                if (stream == null) return;
                
                XmlDocument mapfile = new XmlDocument();
                mapfile.Load(stream);
                
                // 定位到file节点
                XmlNode fileNode = mapfile.SelectSingleNode("//file");
                if (fileNode == null) return;
                
                // 获取目标文件名
                string fileName = fileNode.Attributes["name"]?.Value;
                if (string.IsNullOrEmpty(fileName)) return;
                
                // 提取并解码Base64数据
                string base64Data = fileNode.InnerText.Trim();
                byte[] imageBytes = Convert.FromBase64String(base64Data);
                
                // 拼接保存路径(EXE所在目录)
                string savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
                File.WriteAllBytes(savePath, imageBytes);
            }
        }
    }
}

关键注意点

  • 必须将项目中的happy_face.xml的生成操作设置为嵌入的资源,否则GetManifestResourceStream无法找到资源。
  • 代码添加了空值检查,避免XML结构异常导致运行报错。
  • 解码后的GIF文件会保存到当前程序的运行目录(即EXE所在文件夹)。

内容的提问来源于stack exchange,提问作者Bimo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:15:56