c#-获取base64编码文件的文件名

c#-获取base64编码文件的文件名,c#,.net,xml,encoding,base64,C#,.net,Xml,Encoding,Base64,我正在尝试获取infopath 2007附件文件的名称(在xml中,默认情况下以base64Binary编码),我以前使用相同的代码实现了这一点,但由于某些原因,我无法获取我现在使用的xml文件中附件的原始文件名(我需要找到附件的.extension,文件也需要与以前同名),但是如果我手动写入文件扩展名,我可以导出文件,因此我的问题是:为什么我可以从base64字符串成功写入文件,而我无法获取其名称。 备注: 我目前正在尝试解码图像,我不确定问题是否在这里,但是正如前面提到的,如果我知道.ex

我正在尝试获取infopath 2007附件文件的名称(在xml中,默认情况下以base64Binary编码),我以前使用相同的代码实现了这一点,但由于某些原因,我无法获取我现在使用的xml文件中附件的原始文件名(我需要找到附件的.extension,文件也需要与以前同名),但是如果我手动写入文件扩展名,我可以导出文件,因此我的问题是:为什么我可以从base64字符串成功写入文件,而我无法获取其名称。
备注:

  • 我目前正在尝试解码图像,我不确定问题是否在这里,但是正如前面提到的,如果我知道.ext并手动键入它,我可以解码它
  • 从中获取附件编码字符串的xml文件是从infopath 2007“导出”的(因为没有更好的词,所以保存了?)
  • decodeFromBase64
    工作正常
  • getFileName
    处理了我以前使用的不同的xml“包”,据我所知,没有任何相关差异,因为我能够获得编码字符串并解码文件
  • 我使用的代码与microsoft在解码类中提供的代码非常相似:
编写文件的代码(有效):

获取文件名的代码,该文件名抛出:“System.ArgumentOutOfRangeException”此处: /**********************************************/

byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
  public static string getFileName(string attachedFile)
    {
        string fname;
        byte[] thdata = Convert.FromBase64String(attachedFile);

            Encoding _encoding = Encoding.Unicode;
            using (MemoryStream _memoryStream = new MemoryStream(thdata))
            {

                BinaryReader _theReader = new BinaryReader(_memoryStream);
                _theReader.BaseStream.Position = 0;
                byte[] _headerData = _theReader.ReadBytes(16);

                int _fileSize = (int)_theReader.ReadUInt32();
                int _attachmentNameLength = (int)_theReader.ReadUInt32() * 2;

                byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
                fname = _encoding.GetString(_fileNameBytes, 0, _attachmentNameLength - 2);
                if (fname.Length > 0)
                    return fname;
            }
        return fname;
    }
/**********************************************/

byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
  public static string getFileName(string attachedFile)
    {
        string fname;
        byte[] thdata = Convert.FromBase64String(attachedFile);

            Encoding _encoding = Encoding.Unicode;
            using (MemoryStream _memoryStream = new MemoryStream(thdata))
            {

                BinaryReader _theReader = new BinaryReader(_memoryStream);
                _theReader.BaseStream.Position = 0;
                byte[] _headerData = _theReader.ReadBytes(16);

                int _fileSize = (int)_theReader.ReadUInt32();
                int _attachmentNameLength = (int)_theReader.ReadUInt32() * 2;

                byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
                fname = _encoding.GetString(_fileNameBytes, 0, _attachmentNameLength - 2);
                if (fname.Length > 0)
                    return fname;
            }
        return fname;
    }
编辑:

  • 我忘了提到,不久前我用同样的代码试图解码一个从以前的文件编码的字符串,它成功了
edit2:
《强刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮支支支支支支支支支支支支支支支支支支支支支刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支##########################
即使我找到了解决方案,我也不确定问题的确切来源。我编码的字符串的完整性不知怎么被破坏了(不知怎的,我把测试模板的构建搞砸了,在测试了附件所在的xml文件后,一切都很顺利而且到目前为止,编码字符串不起作用的文件只有我自己的,考虑到我以前从未直接使用过infopath,这完全有道理)
供将来参考:以下是官方解码器和编码器类

  • InfoPath 2003
    support.microsoft\u com/en-us/help/892730/how-to-encode-and-decode-a-file-attachment-programmetically-by-use-visual-c-in-infopath-2003
  • InfoPath 2007和2010
    support.microsoft\u com/en-us/help/2517906/how-to-encode-and-to-decode-a-file-attachment-programmetically-by-use-visual-c-in-infopath-2010-or-in-infopath-2007

    (不能发布超过2个链接,我稍后会编辑)

在我看来,attachmentNameLength中的数值大于流中剩余的字节数,这将导致ArgumentOutOfRangeException。请在debug中查看该值、流的大小以及流在该点的位置。如果我是对的,则在计算名称大小时出现了一些错误,而您是“用一个比你想象的高得多的值来命名。@Kevin你是对的,确实如此,但我正在尝试其他一些编码文件,一切都很好,我真的无法理解当我可以解码所有文件时,我如何才能只得到一些文件的名称(这意味着该文件可能没有错误编码)