关于C#:在该算法中将字节数组转换为字符串时出错

Error While Converting Byte array to string in this algorithm

本问题已经有最佳答案,请猛点这里访问。

我想使用File.Readallbytes(myfile)读取一个文件,并将其转换为类似字符串的文件

1
string s=ByteArraytoString(File.Readallbytes(myfile));

但它并不适用于我选择的每一个文件,而是当文件是Unicode时,它适用于文件,否则它不适用,所以如果有人能帮助我

1
2
3
4
5
6
7
8
9
10
11
12
 public static string ByteArrayToString(byte[] bytes)
        {
            char[] chars = new char[(bytes.Length / sizeof(char))];
            Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
            return new string(chars);
        }
        public static byte[] StringToByteArray(string s)
        {
            byte[] bytes = new byte[s.Length * sizeof(char)];
            Buffer.BlockCopy(s.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }

所以例外是:在bytearraytostring方法中

System.ArgumentException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.
at System.Buffer.BlockCopy(Array src, Int32 srcOffset, Array dst, Int32 dstOffset, Int32 count)

我知道这个解决方案发布了1000次,但没有人用这个代码解决这个问题。


首先,您需要知道文件的编码方式。然后,您可以使用System.Text.Encoding类方便地将字节数组转换为字符串。

例如,如果您的文件是UTF-8格式的,您只需执行以下操作:

1
string s = System.Text.Encoding.UTF8.GetString(bytes);

如果编码不同,只需从Encoding类中选择不同的属性,但模式是相同的。

编辑:简短解释为什么操作代码不起作用

原始文章中的代码试图解释字节数组,就好像它已经使用了与char类型相同的编码,即utf-16。所以,除非您的文件正好使用UTF-16编码,否则它根本就不起作用。使用Encoding类是一种方法。


所以我用这个代码解决了这个问题因为bytes.length是奇数,所以在ByteArrayToString中会出现错误。因此,我要做的是检查bytes.length是否为偶数,它正常地执行代码,但当它为奇数时,它会将一个字节作为0添加到字节的末尾,它将为偶数。

这是我的代码:

1
2
3
4
5
6
if (bytes.Length % 2 != 0) {
                    byte[] newArray = new byte[bytes.Length + 1];
                    bytes.CopyTo(newArray, 1);
                    newArray[0] = byte.Parse("0");
                    bytes= newArray;
                }


为什么不尝试使用默认编码请参见下面的代码段

1
var strString = System.Text.Encoding.Default.GetString(File.Readallbytes(myfile));