byte[] buffer = new byte[] { 221, 234, 146, 216, 150, 191 };
string test = System.Text.Encoding.Unicode.GetString(buffer);
byte[] buffer1 = System.Text.Encoding.Unicode.GetBytes(test);
以上代码在.NET 2003中执行返回值正常,buffer跟buffer1的长度都为6
但是我今天转到.NET 2005时,发现Encoding.Unicode转换String跟byte时
会发生值丢失的情况,所以写以上代码测试,发现buffer的长度是6,但buffer1
的长度却是4,丢失了146跟216这两个值,这是什么问题啊,搞死我了,望赐教.

解决方案 »

  1.   

    然後你全部改為221看看,維數變為多少?非可視字符在Unicode編碼裡被處理了。
      

  2.   

    用ASCII轉換吧: 
    byte[] buffer = new byte[] { 221, 234, 146, 216, 150, 191 };
     string test = System.Text.Encoding.ASCII.GetString(buffer);
     byte[] buffer1 = System.Text.Encoding.ASCII.GetBytes(test);
      

  3.   

    晕,用ASCII是不行的,因为这个只是测试而已,实际上许多要转换的数据都是非ASCII码的,
    Unicode怎么可以自作主张的处理掉我的非可视字符啊, 那我们转过来转过去岂不丢失了数
    据了,有办法解决吗?
      

  4.   

    而且我发现GetBytes也会丢失数据,一个48位长的字串转成byte只有94个byte,
    这样子过滤还不算问题吗? 那有什么办法做到不掉数据完成转换呢.
      

  5.   

    我狂晕,不是任意字节都能转为字符编码再转回来的你如果要实现任意字节转为字符串再转回,可以用Base64编码或转为16进制
      

  6.   

    //Base64编码
    Convert.ToBase64String
    Convert.FromBase64String
      

  7.   

    //16进制字符串//任意byte数组转为字符串
    string str = BitConverter.ToString(byteArr);//转回byte数组
    int len = (str.Length+1)/3
    byte[] byteArr2 = new byte[len]
    for(int i=0;i<len;i++)
    {
        byteArr2[i] = Convert.ToByte(str.Substring(i*3,2),16);
    }
      

  8.   

    我更晕啊,如果不是任何字符都可以转回来,那微软的例子里面特别声明是不会丢失字符的,
    如果不是任何字符都可以转回来,为什么2003时又可以啊,我以前写了个简单的加密程序在一个
    工程里面,加密后的Bytes用GetString转成字符,解密都没有问题的,如果到了2005 GetString
    及GetBytes都会丢失我的数据的话,那我以前加密的数据怎么解密回来啊,那我不是永远也升不
    到2005了,强烈鄙视微软的不负责任. 
    我当然知道用Base64可以解决这个问题,但是我以前加密的数据就没有办法解密了.
    是不用换编码的,以前是用Unicode生成的,这回肯定也要用Unicode了我的加解密源码为:
    /// <summary>
    /// 功能:简单加解密字符串
    /// </summary>
    /// <param name="crypto">动作:R表示加密 H 表示解密</param>
    /// <param name="crypta">要进行加,解密的字串</param>
    /// <returns>
    /// 返回:加或解密后的字符串
    /// </returns>
    public string Cryptogram(string crypto,string crypta)
    { if (crypta == null || crypta == string.Empty )
    {
    return crypta;
    } string cryptg = null;
    TripleDESCryptoServiceProvider triple = new TripleDESCryptoServiceProvider();
    //Key 及IV就不公布了
    byte[] cryptk = new byte[]{};
    byte[] cryptiv = new byte[]{}; ICryptoTransform cryptf = null; switch(crypto[0])
    {
    case 'R':
    cryptf = triple.CreateEncryptor(cryptk,cryptiv);
    break;
    case 'H':
    cryptf = triple.CreateDecryptor(cryptk,cryptiv);
    break;
    } byte[] inputBuffer = Encoding.Unicode.GetBytes(crypta);
    byte[] outputBuffer = cryptf.TransformFinalBlock(inputBuffer,0,inputBuffer.Length); 
    cryptg = Encoding.Unicode.GetString(outputBuffer,0,outputBuffer.Length);  

    return cryptg;
    }
      

  9.   

    我该怎么改代码啊,真是晕死了,我总不能为了升2005就不顾以前的客户了吧.
    我2003中用Unicode.GetString得到的字串,到2005用Unicode.GetBytes都会丢失数据,
    这还是正常的吗