none
异常提示:Base-64 字符串中的无效字符。 RRS feed

  • 问题

  •  /// <summary>
     /// 反序列化
     /// </summary>
     /// <param name="byteData"></param>
     /// <returns></returns>
     public static object Deserialize(string str)
     {
      object obj;
      IFormatter formatter = new BinaryFormatter();
      byte[] byteData = Convert.FromBase64String(str);
      using (Stream stream = new MemoryStream(byteData, 0, byteData.Length))
      {
       obj = formatter.Deserialize(stream);
      }
      return obj;
      }
     }
    

        /// <summary>
         /// 序列化    /// </summary>
         /// <param name="obj"></param>
         /// <returns></returns>
         public static string Serialize(object obj)
         {
           IFormatter formatter = new BinaryFormatter();
           string result = string.Empty;
           using (MemoryStream ms = new MemoryStream())
           {
             formatter.Serialize(ms, obj);
             byte[] byteData = new byte[ms.Length];
             byteData = ms.ToArray();
             result = Convert.ToBase64String(byteData);
             ms.Flush();
           }
           return result;
         }
     

    程序在反序列化时执行到byte[] byteData = Convert.FromBase64String(str);
    时出现异常:Base-64 字符串中的无效字符.

    2011年8月10日 4:32

答案

  • FromBase64String 方法在C#中的定义是这样的:

    public static byte[] FromBase64String(
    	string s
    )
    
    

    s 由基 64 数字、空白字符和尾随填充字符组成。从零开始以升序排列的以 64 为基的数字为大写字符"A"到"Z"、小写字符"a"到"z"、数字"0"到"9"以及符号"+"和"/"。

    空白字符及其 Unicode 名称和十六进制码位为:制表符(CHARACTER TABULATION,U+0009)、换行符(LINE FEED,U+000A)、回车符(CARRIAGE RETURN,U+000D)和空格符(SPACE,U+0020)。s 中可以出现任意数目的空白字符,因为所有空白字符都将被忽略。

    无值字符"="用于尾部的空白。s 的末尾可以包含零个、一个或两个填充字符。

    详情查看: http://msdn.microsoft.com/zh-cn/library/7y0k9etd(v=VS.95).aspx


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 MaJiXiang 2011年8月12日 8:46
    2011年8月12日 5:42
    版主

  • 应该符合吧?

    我在序列化时用的string result = Convert.ToBase64String(byteData);
    反序列化时用的 byte[] byteData = Convert.FromBase64String(str);

     [System.FormatException] = {"Base-64 字符串中的无效字符。"}


    dear

    请不要用应该来猜测,设定中断点检查才是正确的

    会发生Exception的原因如官网所述

    s 的长度(忽略空白字符)不是 0 或 4 的倍数。

    - 或 -

    s 的格式无效。 s 包含一个非 base 64 字符、两个以上的填充字符或者在填充字符中包含非空白字符。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 MaJiXiang 2011年8月12日 8:46
    2011年8月12日 5:47

全部回复

  • str = "AAEAAAD/////AQAAAAAAAAAMAgAAAEFTb2NrZXREYXRhLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAFVNvY2tldERhdGEuU29ja2V0SU5GTwoAAAAZPFNvY2tldElEPmtfX0JhY2tpbmdGaWVsZBs8U29ja2V0TmFtZT5rX19CYWNraW5nRmllbGQePFNvY2tldENvbW1hbmQ+**+a19fQmFja2luZ0ZpZWxkHjxJc1NlbmRXYWl0T25lPmtfX0JhY2tpbmdGaWVsZB08SXNDbGllbnRRdWl0PmtfX0JhY2tpbmdGaWVsZCI8S**+a19fQmFja2luZ0ZpZWxkITxJc1JlY2VpdmVTdWNjZXNzPmtfX0JhY2tpbmdGaWVsZCQ8U2VydmVyU2VuZFRvVXNlck51bT5rX19CYWNraW5nRmllbGQBAQQBAAAAAAAAElNvY2tldERhdGEuQ29tbWFuZAIAAAABAQEBAQgCAAAABgMAAAAcMTkyLjE2OC4xLjk5OldpbmRvd3M3LVBDMTg3MAkDAAAABfz///8SU29ja2V0RGF0YS5Db21tYW5kAQAAAAd2YWx1ZV9fAAgCAAAAAAAAAAoBAAAAAAAAAAAL"
    

    2011年8月10日 4:37
  • dear

    检查字符是否符合规定

    http://msdn.microsoft.com/zh-cn/library/system.convert.frombase64string.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年8月10日 4:40
  • 应该符合吧?

    我在序列化时用的string result = Convert.ToBase64String(byteData);
    反序列化时用的 byte[] byteData = Convert.FromBase64String(str);

     [System.FormatException] = {"Base-64 字符串中的无效字符。"}


    2011年8月10日 4:44
  • 看这个不像是正确的 Base64,Base64 因该有两个 == 结尾的。
    Mark Zhou
    2011年8月10日 14:57
  • 好像不应该有*
    本帖内容仅供参考,没有任何保证. This post is provided without any warranty.
    2011年8月11日 11:13
    版主
  • FromBase64String 方法在C#中的定义是这样的:

    public static byte[] FromBase64String(
    	string s
    )
    
    

    s 由基 64 数字、空白字符和尾随填充字符组成。从零开始以升序排列的以 64 为基的数字为大写字符"A"到"Z"、小写字符"a"到"z"、数字"0"到"9"以及符号"+"和"/"。

    空白字符及其 Unicode 名称和十六进制码位为:制表符(CHARACTER TABULATION,U+0009)、换行符(LINE FEED,U+000A)、回车符(CARRIAGE RETURN,U+000D)和空格符(SPACE,U+0020)。s 中可以出现任意数目的空白字符,因为所有空白字符都将被忽略。

    无值字符"="用于尾部的空白。s 的末尾可以包含零个、一个或两个填充字符。

    详情查看: http://msdn.microsoft.com/zh-cn/library/7y0k9etd(v=VS.95).aspx


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 MaJiXiang 2011年8月12日 8:46
    2011年8月12日 5:42
    版主

  • 应该符合吧?

    我在序列化时用的string result = Convert.ToBase64String(byteData);
    反序列化时用的 byte[] byteData = Convert.FromBase64String(str);

     [System.FormatException] = {"Base-64 字符串中的无效字符。"}


    dear

    请不要用应该来猜测,设定中断点检查才是正确的

    会发生Exception的原因如官网所述

    s 的长度(忽略空白字符)不是 0 或 4 的倍数。

    - 或 -

    s 的格式无效。 s 包含一个非 base 64 字符、两个以上的填充字符或者在填充字符中包含非空白字符。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 MaJiXiang 2011年8月12日 8:46
    2011年8月12日 5:47