1

我正在尝试使用 Encoding.Unicode 将 byte[] 转换为字符串并返回。有时 Encoding.Unicode 能够将 byte[] 转换为字符串,有时输出是 != 输入。我究竟做错了什么?

谢谢你的帮助。

public static void Main(string[] args)
{
    Random rnd = new Random();
    while(true)
    {
        Int32 random = rnd.Next(10, 20);
        Byte[] inBytes = new Byte[random];
        for(int i = 0; i < random; i++)
            inBytes[i] = (Byte)rnd.Next(0, 9);

        String inBytesString = Encoding.Unicode.GetString(inBytes, 0, inBytes.Length);
        Byte[] outBytes = Encoding.Unicode.GetBytes(inBytesString);

        if(inBytes.Length != outBytes.Length)
            throw new Exception("?");
        else
        {
            for(int i = 0; i < inBytes.Length; i++)
            {
                if(inBytes[i] != outBytes[i])
                    throw new Exception("?");
            }
        }
        Console.WriteLine("OK");
    }
}
4

3 回答 3

6

您不能为此使用编码:您必须使用 Convert.ToBase64String / Convert.FromBase64String 之类的东西。

编码假定 byte[] 是根据特定规则格式化的,而随机的非字符串 byte[] 则不是这种情况。

总结一下:

编码将任意字符串转换为格式化的字节[]

Base-64 将任意 byte[] 转换为/从格式化字符串

于 2012-10-09T13:33:01.990 回答
0
you cannot use encoding use base64

使用base64u 可以安全地将字节转换为字符串并返回

base64 guaranteed to not to get "invalid" unicode sequences喜欢:
没有后半部分的代理对的前半部分使用如下:

string base64 = Convert.ToBase64String(bytes);
byte[] bytes = Convert.FromBase64String(base64);
于 2012-10-09T13:34:51.297 回答
0

这是一个示例,我将图像更改为位数组,然后将其转换回可读字符串。

protected bool isImageCMYK(HttpPostedFile image, Stream fileContent)
    {
            //creating byte array
        byte[] imageToByteArray = new byte[image.ContentLength];

            //filling the byte array
        fileContent.Read(imageToByteArray, 0 , image.ContentLength);

            //convering byte array back to a readable string
        UTF8Encoding byteToString = new UTF8Encoding();
        string imageString = byteToString.GetString(imageToByteArray);

        return imageString.ToLower().Contains("cmyk");
    }

这是编辑后的代码,导致输出“OK”

public static void Main(string[] args)
        {
            Random rnd = new Random();
            while (true)
            {
                Int32 random = rnd.Next(10, 20);
                Byte[] inBytes = new Byte[random];
                for (int i = 0; i < random; i++)
                    inBytes[i] = (Byte)rnd.Next(0, 9);

                UTF8Encoding inBytesString = new UTF8Encoding(); 
                string byteString = inBytesString.GetString(inBytes, 0, inBytes.Length);
                //Byte[] outBytes = Encoding.Unicode.GetBytes(inBytesString);
                Byte[] outBytes = inBytesString.GetBytes(byteString);

                if (inBytes.Length != outBytes.Length)
                    throw new Exception("?");
                else
                {
                    for (int i = 0; i < inBytes.Length; i++)
                    {
                        if (inBytes[i] != outBytes[i])
                            throw new Exception("?");
                    }
                }
                Console.WriteLine("OK");
            }
于 2012-10-09T13:46:58.173 回答